From a0e4f8536593dc6f67f7439d77be367af74de736 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20W?= Date: Sat, 30 Jan 2021 21:07:59 +0100 Subject: [PATCH] feat(graph): New chart types `scatter`, `donut`, `pie` and `radialBar` (#24) * Add scatter graph type * pie, donut, radialBar and documentation --- .devcontainer/ui-lovelace.yaml | 582 ++++++++++++++++++--------------- README.md | 19 +- docs/charts_type.png | Bin 0 -> 89142 bytes src/apex-layouts.ts | 60 +++- src/apexcharts-card.ts | 100 +++--- src/const.ts | 4 + src/types-config-ti.ts | 3 + src/types-config.ts | 3 + src/utils.ts | 8 +- 9 files changed, 463 insertions(+), 316 deletions(-) create mode 100644 docs/charts_type.png diff --git a/.devcontainer/ui-lovelace.yaml b/.devcontainer/ui-lovelace.yaml index 5131208..13af149 100644 --- a/.devcontainer/ui-lovelace.yaml +++ b/.devcontainer/ui-lovelace.yaml @@ -1,273 +1,337 @@ views: - title: Main + panel: true cards: - - type: custom:apexcharts-card - apex_config: - chart: - toolbar: - show: true - tools: - zoom: true - zoomin: true - zoomout: true - pan: true - reset: true - zoom: - enabled: true - update_interval: 5sec - stacked: true - series: - - entity: sensor.random_0_1000 - name: Sensor 1 - type: area - curve: straight - color: yellow - - entity: sensor.random_0_1000 - name: Sensor 2 - type: area - offset: -1d - graph_span: 15min - cache: true - layout: minimal - header: - show: false + - type: grid + columns: 3 + cards: + - type: custom:apexcharts-card + apex_config: + chart: + toolbar: + show: true + tools: + zoom: true + zoomin: true + zoomout: true + pan: true + reset: true + zoom: + enabled: true + update_interval: 5sec + stacked: true + series: + - entity: sensor.random_0_1000 + name: Sensor 1 + type: area + curve: straight + color: yellow + - entity: sensor.random_0_1000 + name: Sensor 2 + type: area + offset: -1d + graph_span: 15min + cache: true + layout: minimal + header: + show: false - - type: custom:apexcharts-card - stacked: true - span: - offset: -1d - series: - - entity: sensor.random_0_1000 - name: RAM Usage - unit: Mb - type: area - curve: smooth - - entity: sensor.random_0_1000 - name: Ram Free - type: area - graph_span: 15min - cache: true - layout: minimal - header: - floating: true + - type: custom:apexcharts-card + stacked: true + span: + offset: -1d + series: + - entity: sensor.random_0_1000 + name: RAM Usage + unit: Mb + type: area + curve: smooth + - entity: sensor.random_0_1000 + name: Ram Free + type: area + graph_span: 15min + cache: true + layout: minimal + header: + floating: true - - type: custom:apexcharts-card - stacked: false - series: - - entity: sensor.random_0_1000 - name: test1 - type: column - - entity: sensor.random_0_1000 - name: test2 - type: column - graph_span: 20min - cache: true - - type: custom:apexcharts-card - graph_span: 200h - series: - - entity: sensor.humidity - curve: straight + - type: custom:apexcharts-card + stacked: false + series: + - entity: sensor.random_0_1000 + name: test1 + type: column + - entity: sensor.random_0_1000 + name: test2 + type: column + graph_span: 20min + cache: true + - type: custom:apexcharts-card + graph_span: 200h + series: + - entity: sensor.humidity + curve: straight - - type: custom:apexcharts-card - graph_span: 1h - header: - title: Test Aggregate - show: true - show_states: true - colorize_states: true - series: - - entity: sensor.random0_100 - name: AVG - curve: smooth - type: line - show: - as_duration: millisecond - group_by: - duration: 10min - func: avg - - entity: sensor.random0_100 - name: AVG - curve: smooth - type: line - show: - as_duration: minute - group_by: - duration: 10min - func: avg - - entity: sensor.random0_100 - curve: smooth - name: MIN - type: line - show: - as_duration: hour - group_by: - duration: 10min - func: min - - entity: sensor.random0_100 - curve: smooth - name: MAX - type: line - show: - as_duration: day - group_by: - duration: 10min - func: max - - entity: sensor.random0_100 - curve: smooth - name: LAST - type: line - show: - as_duration: month - group_by: - duration: 10min - func: last - - entity: sensor.random0_100 - curve: smooth - name: FIRST - type: line - show: - as_duration: year - group_by: - duration: 10min - func: first + - type: custom:apexcharts-card + graph_span: 1h + header: + title: Test Aggregate + show: true + show_states: true + colorize_states: true + series: + - entity: sensor.random0_100 + name: AVG + curve: smooth + type: line + show: + as_duration: millisecond + group_by: + duration: 10min + func: avg + - entity: sensor.random0_100 + name: AVG + curve: smooth + type: line + show: + as_duration: minute + group_by: + duration: 10min + func: avg + - entity: sensor.random0_100 + curve: smooth + name: MIN + type: line + show: + as_duration: hour + group_by: + duration: 10min + func: min + - entity: sensor.random0_100 + curve: smooth + name: MAX + type: line + show: + as_duration: day + group_by: + duration: 10min + func: max + - entity: sensor.random0_100 + curve: smooth + name: LAST + type: line + show: + as_duration: month + group_by: + duration: 10min + func: last + - entity: sensor.random0_100 + curve: smooth + name: FIRST + type: line + show: + as_duration: year + group_by: + duration: 10min + func: first - - type: custom:apexcharts-card - graph_span: 4h - header: - title: Test - series: - - entity: sensor.humidity - type: area - name: Outside Humidity - group_by: - func: avg - duration: 1h - - entity: sensor.random0_100 - type: area - name: Office Humidity - group_by: - func: avg - duration: 1h - - type: sensor - entity: sensor.humidity - graph: line + - type: custom:apexcharts-card + graph_span: 4h + header: + title: Test + series: + - entity: sensor.humidity + type: area + name: Outside Humidity + group_by: + func: avg + duration: 1h + - entity: sensor.random0_100 + type: area + name: Office Humidity + group_by: + func: avg + duration: 1h + - type: sensor + entity: sensor.humidity + graph: line - - type: custom:apexcharts-card - graph_span: 6h - header: - show: false - series: - - entity: sensor.humidity - type: line - name: Outside Humidity - group_by: - func: avg - duration: 30min - - entity: sensor.random0_100 - type: column - name: Office Humidity - group_by: - func: avg - duration: 30min + - type: custom:apexcharts-card + graph_span: 6h + header: + show: false + series: + - entity: sensor.humidity + type: line + name: Outside Humidity + group_by: + func: avg + duration: 30min + - entity: sensor.random0_100 + type: column + name: Office Humidity + group_by: + func: avg + duration: 30min - - type: custom:apexcharts-card - header: - show: true - title: Start of day - graph_span: 24h - span: - start: day - apex_config: - dataLabels: - enabled: true - dropShadow: - enabled: true - series: - - entity: sensor.random0_100 - extend_to_end: false - type: column - group_by: - func: avg - fill: 'null' + - type: custom:apexcharts-card + header: + show: true + title: Start of day + graph_span: 24h + span: + start: day + apex_config: + dataLabels: + enabled: true + dropShadow: + enabled: true + series: + - entity: sensor.random0_100 + extend_to_end: false + type: column + group_by: + func: avg + fill: 'null' - - type: custom:apexcharts-card - header: - show: true - title: Last 8h - graph_span: 8h - span: - end: hour - apex_config: - dataLabels: - enabled: true - dropShadow: - enabled: true - yaxis: - - title: - text: test1 + - type: custom:apexcharts-card + header: show: true - opposite: true - decimalsInFloat: 1 - - title: - text: Test2 + title: Last 8h + graph_span: 8h + span: + end: hour + apex_config: + dataLabels: + enabled: true + dropShadow: + enabled: true + yaxis: + - title: + text: test1 + show: true + opposite: true + decimalsInFloat: 1 + - title: + text: Test2 + show: true + # opposite: true + decimalsInFloat: 1 + series: + - entity: sensor.random0_100 + extend_to_end: false + type: column + invert: true + group_by: + func: avg + fill: 'last' + show: + legend_value: false + - entity: sensor.random0_100 + extend_to_end: false + type: column + group_by: + func: avg + fill: 'last' + - entity: sensor.random0_100 + extend_to_end: false + type: column + group_by: + func: avg + fill: 'last' + + - type: custom:apexcharts-card + span: + start: day + y_axis_precision: 5 + header: show: true - # opposite: true - decimalsInFloat: 1 - series: - - entity: sensor.random0_100 - extend_to_end: false - type: column - invert: true - group_by: - func: avg - fill: 'last' - show: - legend_value: false - - entity: sensor.random0_100 - extend_to_end: false - type: column - group_by: - func: avg - fill: 'last' - - entity: sensor.random0_100 - extend_to_end: false - type: column - group_by: - func: avg - fill: 'last' + show_states: true + series: + - entity: sensor.pvpc + float_precision: 5 + data_generator: | + return [...Array(22).keys()].map((hour) => { + const attr = 'price_' + `${hour}`.padStart(2, '0') + 'h'; + const value = entity.attributes[attr]; + return [moment().startOf('day').hours(hour).valueOf(), value]; + }) - - type: custom:apexcharts-card - span: - start: day - y_axis_precision: 5 - header: - show: true - show_states: true - series: - - entity: sensor.pvpc - float_precision: 5 - data_generator: | - return [...Array(22).keys()].map((hour) => { - const attr = 'price_' + `${hour}`.padStart(2, '0') + 'h'; - const value = entity.attributes[attr]; - return [moment().startOf('day').hours(hour).valueOf(), value]; - }) + - type: custom:apexcharts-card + graph_span: 8d + span: + start: hour + # apex_config: + # dataLabels: + # enabled: true + header: + show: true + title: Precipitation Forecast + series: + - entity: weather.openweathermap + type: area + extend_to_end: false + data_generator: | + return entity.attributes.forecast.map((entry) => { + return [new Date(entry.datetime), entry.temperature]; + }); - - type: custom:apexcharts-card - graph_span: 8d - span: - start: hour - # apex_config: - # dataLabels: - # enabled: true - header: - show: true - title: Precipitation Forecast - series: - - entity: weather.openweathermap - type: area - extend_to_end: false - data_generator: | - return entity.attributes.forecast.map((entry) => { - return [new Date(entry.datetime), entry.temperature]; - }); + - type: custom:apexcharts-card + header: + show: true + title: radialBar + chart_type: radialBar + series: + - entity: sensor.random0_100 + - entity: sensor.random_0_1000 + min: 0 + max: 1000 + - type: custom:apexcharts-card + chart_type: pie + header: + show: true + title: pie + series: + - entity: sensor.random0_100 + - entity: sensor.random_0_1000 + - type: custom:apexcharts-card + chart_type: donut + header: + show: true + title: donut + series: + - entity: sensor.random0_100 + - entity: sensor.random_0_1000 + - type: custom:apexcharts-card + chart_type: line + graph_span: 15m + header: + show: true + title: line + series: + - entity: sensor.random0_100 + - entity: sensor.random_0_1000 + - type: custom:apexcharts-card + header: + show: true + title: Scatter + chart_type: scatter + apex_config: + responsive: + - breakpoint: 400 + options: + chart: + height: 500px + - breakpoint: 5000 + options: + chart: + height: auto + series: + - entity: sensor.random0_100 + group_by: + func: sum + duration: 20min + - entity: sensor.random_0_1000 + group_by: + func: sum + duration: 20min diff --git a/README.md b/README.md index 38a976d..9f5440a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ However, some things might be broken :grin: - [`header` Options](#header-options) - [`group_by` Options](#group_by-options) - [`func` Options](#func-options) + - [`chart_type` Options](#chart_type-options) - [`span` Options](#span-options) - [`data_generator` Option](#data_generator-option) - [Apex Charts Options Example](#apex-charts-options-example) @@ -103,6 +104,7 @@ The card stricly validates all the options available (but not for the `apex_conf | ---- | :--: | :-----: | :---: | ----------- | | :white_check_mark: `type` | string | | v1.0.0 | `custom:apexcharts-card` | | :white_check_mark: `series` | array | | v1.0.0 | See [series](#series-options) | +| `chart_type` | string | `line` | NEXT_VERSION | See [chart_type](#chart_type-options) | | `update_interval` | string | | v1.1.0 | By default the card updates on every state change. Setting this overrides the behaviour. Valid values are any time string, eg: `1h`, `12min`, `1d`, `1h25`, `10sec`, ... | | `graph_span` | string | `24h` | v1.1.0 | The span of the graph as a time interval. Valid values are any time string, eg: `1h`, `12min`, `1d`, `1h25`, `10sec`, ... | | `span` | object | | v1.2.0 | See [span](#span-options) | @@ -132,7 +134,8 @@ The card stricly validates all the options available (but not for the `apex_conf | `invert` | boolean | `false` | v1.2.0 | Negates the data (`1` -> `-1`). Usefull to display opposites values like network in (standard)/out (inverted) | | `data_generator` | string | | v1.2.0 | See [data_generator](#data_generator-option) | | `offset` | string | | v1.3.0 | This is different from the main `offset` parameter. This is at the series level. It is only usefull if you want to display data from for eg. yesterday on top of the data from today for the same sensor and compare the data. The time displayed in the tooltip will be wrong as will the x axis information. Valid values are any negative time string, eg: `-1h`, `-12min`, `-1d`, `-1h25`, `-10sec`, ... | - +| `min` | number | `0` | NEXT_VERSION | Only used when `chart_type = radialBar`, see [chart_type](#chart_type-options). Used to convert the value into a percentage. Minimum value of the sensor | +| `max` | number | `100` | NEXT_VERSION | Only used when `chart_type = radialBar`, see [chart_type](#chart_type-options). Used to convert the value into a percentage. Maximum value of the sensor | ### `series.show` Options @@ -180,6 +183,18 @@ The card stricly validates all the options available (but not for the `apex_conf | `median` | v1.0.0 | Will return the median of all the states in each bucket | | `delta` | v1.0.0 | Will return the delta between the biggest and smallest state in each bucket | +### `chart_type` Options + +| Name | Since | Description | +| ---- | :---: | ----------- | +| `line` | v1.0.0 | This is the default and will show a timeline. It is compatible with `series.type` = `column`, `line` and `area` | +| `scatter` | NEXT_VERSION | Displays a cloud of points without a line between the values | +| `pie` | NEXT_VERSION | This will display a pie chart with the last value computed of each sensor | +| `donut` | NEXT_VERSION | This will display a donut chart with the last value computed of each sensor, same as pie but with a hole in the center | +| `radialBar` | NEXT_VERSION | This will display a radial bar chart with the last value computed of each sensor. The value is represented in percentage only. It is required to provide `min` and `max` for each series displayed as it requires to convert the value into percentage. The default value for `min` is `0` and for `max` it is `100`. This graph works well if you want to display sensors natively in percentages | + +![Charts Type](docs/charts_type.png) + ### `span` Options | Name | Since | Description | @@ -346,7 +361,7 @@ For code junkies, you'll find the default options I use in [`src/apex-layouts.ts Not ordered by priority: -* [ ] Support more types of charts (pie, radial, polar area at least) +* [X] ~~Support more types of charts (pie, radial, polar area at least)~~ * [ ] Support for `binary_sensors` * [X] ~~Support for aggregating data with exact boundaries (ex: aggregating data with `1h` could aggregate from `2:00:00am` to `2:59:59am` then `3:00:00am` to `3:59:59` exactly, etc...)~~ * [X] ~~Display the graph from start of day, week, month, ... with support for "up to now" or until the "end of the period"~~ diff --git a/docs/charts_type.png b/docs/charts_type.png new file mode 100644 index 0000000000000000000000000000000000000000..09605a7445960374e2ec5f4b519fa39530305b88 GIT binary patch literal 89142 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�hJQTya?=tX{iBZI)WQaXD4KSE4+3}#D} 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 bbA?~^?#CDK%n@@EVE_V8S3j3^P6 { - return { - name: computeName(index, config, undefined, hass?.states[serie.entity]), - type: serie.type, - data: [], - }; - }), - xaxis: { - type: 'datetime', - // range: getMilli(config.hours_to_show), - labels: { - datetimeUTC: false, - }, - }, + series: TIMESERIES_TYPES.includes(config.chart_type) + ? config?.series.map((serie, index) => { + return { + name: computeName(index, config, undefined, hass?.states[serie.entity]), + type: serie.type, + data: [], + }; + }) + : [], + labels: TIMESERIES_TYPES.includes(config.chart_type) + ? [] + : config.series.map((serie, index) => { + return computeName(index, config, undefined, hass?.states[serie.entity]); + }), + xaxis: TIMESERIES_TYPES.includes(config.chart_type) + ? { + type: 'datetime', + // range: getMilli(config.hours_to_show), + labels: { + datetimeUTC: false, + }, + } + : {}, yaxis: Array.isArray(config.apex_config?.yaxis) ? undefined : { @@ -98,7 +108,19 @@ export function getLayoutConfig(config: ChartCardConfig, hass: HomeAssistant | u return lValue; }, }, + plotOptions: { + radialBar: + config.chart_type === 'radialBar' + ? { + track: { + background: 'rgba(128, 128, 128, 0.2)', + }, + } + : {}, + }, legend: { + position: 'bottom', + show: true, formatter: function (_, opts, conf = config, hass2 = hass) { const name = computeName( opts.seriesIndex, @@ -109,7 +131,9 @@ export function getLayoutConfig(config: ChartCardConfig, hass: HomeAssistant | u if (!conf.series[opts.seriesIndex].show.legend_value) { return [name]; } else { - let value = opts.w.globals.series[opts.seriesIndex].slice(-1)[0]; + let value = TIMESERIES_TYPES.includes(config.chart_type) + ? opts.w.globals.series[opts.seriesIndex].slice(-1)[0] + : opts.w.globals.series[opts.seriesIndex]; if ( value !== null && typeof value === 'number' && @@ -150,7 +174,9 @@ export function getLayoutConfig(config: ChartCardConfig, hass: HomeAssistant | u curve: config.series.map((serie) => { return serie.curve || 'smooth'; }), - lineCap: 'butt', + lineCap: config.chart_type === 'radialBar' ? 'round' : 'butt', + colors: + config.chart_type === 'pie' || config.chart_type === 'donut' ? ['var(--card-background-color)'] : undefined, }, markers: { showNullDataPoints: false, diff --git a/src/apexcharts-card.ts b/src/apexcharts-card.ts index 3df5d1a..345d1c0 100644 --- a/src/apexcharts-card.ts +++ b/src/apexcharts-card.ts @@ -9,6 +9,7 @@ import { computeName, computeUom, decompress, + getPercentFromValue, log, mergeDeep, offsetData, @@ -24,7 +25,7 @@ import GraphEntry from './graphEntry'; import { createCheckers } from 'ts-interface-checker'; import { ChartCardExternalConfig } from './types-config'; import exportedTypeSuite from './types-config-ti'; -import { DEFAULT_FLOAT_PRECISION, DEFAULT_SHOW_LEGEND_VALUE, moment, NO_VALUE } from './const'; +import { DEFAULT_FLOAT_PRECISION, DEFAULT_SHOW_LEGEND_VALUE, moment, NO_VALUE, TIMESERIES_TYPES } from './const'; import { DEFAULT_COLORS, DEFAULT_DURATION, @@ -222,7 +223,8 @@ class ChartsCard extends LitElement { this._colors![index] = serie.color; } serie.extend_to_end = serie.extend_to_end !== undefined ? serie.extend_to_end : true; - serie.type = serie.type || DEFAULT_SERIE_TYPE; + serie.type = this._config?.chart_type ? undefined : serie.type || DEFAULT_SERIE_TYPE; + serie.unit = this._config?.chart_type === 'radialBar' ? '%' : serie.unit; if (!serie.group_by) { serie.group_by = { duration: DEFAULT_DURATION, func: DEFAULT_FUNC, fill: DEFAULT_GROUP_BY_FILL }; } else { @@ -372,49 +374,73 @@ class ChartsCard extends LitElement { ), ); await Promise.all(promise); - const graphData = { - series: this._graphs.map((graph) => { - if (!graph || graph.history.length === 0) return { data: [] }; - const index = graph.index; - if (graph.history.length > 0) { - this._lastState[index] = graph.history[graph.history.length - 1][1]; - if ( - this._lastState[index] !== null && - typeof this._lastState[index] === 'number' && - !Number.isInteger(this._lastState[index]) - ) { - const precision = - this._config?.series[index].float_precision === undefined - ? DEFAULT_FLOAT_PRECISION - : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - this._config.series[index].float_precision!; - this._lastState[index] = (this._lastState[index] as number).toFixed(precision); + let graphData: unknown = {}; + if (TIMESERIES_TYPES.includes(this._config.chart_type)) { + graphData = { + series: this._graphs.map((graph, index) => { + if (!graph || graph.history.length === 0) return { data: [] }; + this._lastState[index] = this._computeLastState(graph.history[graph.history.length - 1][1], index); + let data: EntityCachePoints = []; + if (this._config?.series[index].extend_to_end && this._config?.series[index].type !== 'column') { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + data = [...graph.history, ...([[end.getTime(), graph.history.slice(-1)[0]![1]]] as EntityCachePoints)]; + } else { + data = graph.history; } - } - let data: EntityCachePoints = []; - if (this._config?.series[index].extend_to_end && this._config?.series[index].type !== 'column') { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - data = [...graph.history, ...([[end.getTime(), graph.history.slice(-1)[0]![1]]] as EntityCachePoints)]; - } else { - data = graph.history; - } - data = offsetData(data, this._seriesOffset[index]); - return this._config?.series[index].invert ? { data: this._invertData(data) } : { data }; - }), - xaxis: { - min: start.getTime(), - max: this._findEndOfChart(end), - }, - colors: computeColors(this._colors), - }; + data = offsetData(data, this._seriesOffset[index]); + return this._config?.series[index].invert ? { data: this._invertData(data) } : { data }; + }), + xaxis: { + min: start.getTime(), + max: this._findEndOfChart(end), + }, + colors: computeColors(this._colors), + }; + } else { + // No timeline charts + graphData = { + series: this._graphs.map((graph, index) => { + if (!graph || graph.history.length === 0) return; + const lastState = graph.history[graph.history.length - 1][1]; + this._lastState[index] = this._computeLastState(lastState, index); + if (lastState === null) { + return; + } else { + if (this._config?.chart_type === 'radialBar') { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + return getPercentFromValue(lastState, this._config.series[index].min, this._config.series[index].max); + } else { + return lastState; + } + } + }), + colors: computeColors(this._colors), + }; + } this._lastState = [...this._lastState]; - this._apexChart?.updateOptions(graphData, false, false); + this._apexChart?.updateOptions( + graphData, + false, + TIMESERIES_TYPES.includes(this._config.chart_type) ? false : true, + ); } catch (err) { log(err); } this._updating = false; } + private _computeLastState(value: number | null, index: number): string | number | null { + if (value !== null && typeof value === 'number' && !Number.isInteger(value)) { + const precision = + this._config?.series[index].float_precision === undefined + ? DEFAULT_FLOAT_PRECISION + : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + this._config.series[index].float_precision!; + return (value as number).toFixed(precision); + } + return value; + } + /* Makes the chart end at the last timestamp of the data when everything displayed is a column and group_by is enabled for every serie diff --git a/src/const.ts b/src/const.ts index cb83d91..88bed2d 100644 --- a/src/const.ts +++ b/src/const.ts @@ -33,3 +33,7 @@ export const DEFAULT_COLORS = [ ]; export const NO_VALUE = 'N/A'; +export const TIMESERIES_TYPES = ['line', 'scatter', undefined]; + +export const DEFAULT_MIN = 0; +export const DEFAULT_MAX = 100; diff --git a/src/types-config-ti.ts b/src/types-config-ti.ts index f29ca3f..037536d 100644 --- a/src/types-config-ti.ts +++ b/src/types-config-ti.ts @@ -6,6 +6,7 @@ import * as t from "ts-interface-checker"; export const ChartCardExternalConfig = t.iface([], { "type": t.lit('custom:apexcharts-card'), + "chart_type": t.opt(t.union(t.lit('line'), t.lit('scatter'), t.lit('pie'), t.lit('donut'), t.lit('radialBar'))), "update_interval": t.opt("string"), "series": t.array("ChartCardSeriesExternalConfig"), "graph_span": t.opt("string"), @@ -39,6 +40,8 @@ export const ChartCardSeriesExternalConfig = t.iface([], { "invert": t.opt("boolean"), "data_generator": t.opt("string"), "float_precision": t.opt("number"), + "min": t.opt("number"), + "max": t.opt("number"), "offset": t.opt("string"), "show": t.opt(t.iface([], { "as_duration": t.opt("ChartCardPrettyTime"), diff --git a/src/types-config.ts b/src/types-config.ts index dbe5309..b89ff2b 100644 --- a/src/types-config.ts +++ b/src/types-config.ts @@ -1,5 +1,6 @@ export interface ChartCardExternalConfig { type: 'custom:apexcharts-card'; + chart_type?: 'line' | 'scatter' | 'pie' | 'donut' | 'radialBar'; update_interval?: string; series: ChartCardSeriesExternalConfig[]; graph_span?: string; @@ -35,6 +36,8 @@ export interface ChartCardSeriesExternalConfig { invert?: boolean; data_generator?: string; float_precision?: number; + min?: number; + max?: number; offset?: string; show?: { as_duration?: ChartCardPrettyTime; diff --git a/src/utils.ts b/src/utils.ts index ff37a91..536b7ef 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -4,7 +4,7 @@ import { ChartCardConfig, EntityCachePoints } from './types'; import { TinyColor } from '@ctrl/tinycolor'; import parse from 'parse-duration'; import { ChartCardPrettyTime } from './types-config'; -import { moment, NO_VALUE } from './const'; +import { DEFAULT_MAX, DEFAULT_MIN, moment, NO_VALUE } from './const'; export function compress(data: unknown): string { return lzStringCompress(JSON.stringify(data)); @@ -142,3 +142,9 @@ export function prettyPrintTime(value: string | number | null, unit: ChartCardPr if (value === null) return NO_VALUE; return moment.duration(value, unit).format('y[y] d[d] h[h] m[m] s[s] S[ms]', { trim: 'both' }); } + +export function getPercentFromValue(value: number, min: number | undefined, max: number | undefined): number { + const lMin = min === undefined ? DEFAULT_MIN : min; + const lMax = max === undefined ? DEFAULT_MAX : max; + return ((value - lMin) * 100) / (lMax - lMin); +}