diff --git a/README.md b/README.md index 47f2eca..2844b7b 100644 --- a/README.md +++ b/README.md @@ -106,6 +106,7 @@ Lovelace Button card for your entities. | `label` | string | optional | Any string that you want | Display a label below the card. See [Layouts](#layout) for more information. Supports templates, see [templates](#javascript-templates) | | `show_name` | boolean | `true` | `true` \| `false` | Wether to show the name or not. Will pick entity_id's name by default, unless redefined in the `name` property or in any state `name` property | | `show_state` | boolean | `false` | `true` \| `false` | Show the state on the card. defaults to false if not set | +| `numeric_precision` | number | none | any number | Force the display precision of the state to be with `numeric_precision` decimals | | `show_icon` | boolean | `true` | `true` \| `false` | Wether to show the icon or not. Unless redefined in `icon`, uses the default entity icon from hass | | `show_units` | boolean | `true` | `true` \| `false` | Display or hide the units of a sensor, if any. | | `show_label` | boolean | `false` | `true` \| `false` | Display or hide the `label` | diff --git a/src/button-card.ts b/src/button-card.ts index 4bfb1f6..93a0d58 100644 --- a/src/button-card.ts +++ b/src/button-card.ts @@ -302,6 +302,7 @@ class ButtonCard extends LitElement { this._hass!.locale, this._hass!.config, this._hass!.entities, + this._config?.numeric_precision, state, ); } @@ -553,6 +554,7 @@ class ButtonCard extends LitElement { this._hass!.locale, this._hass!.config, this._hass!.entities, + this._config?.numeric_precision, ); } else { stateString = this._computeTimeDisplay(stateObj); @@ -563,6 +565,7 @@ class ButtonCard extends LitElement { this._hass!.locale, this._hass!.config, this._hass!.entities, + this._config?.numeric_precision, )})`; } } @@ -575,6 +578,7 @@ class ButtonCard extends LitElement { this._hass!.locale, this._hass!.config, this._hass!.entities, + this._config?.numeric_precision, ); } } diff --git a/src/common/compute_state_display.ts b/src/common/compute_state_display.ts index a7e59c8..42233dd 100644 --- a/src/common/compute_state_display.ts +++ b/src/common/compute_state_display.ts @@ -24,6 +24,7 @@ export const computeStateDisplaySingleEntity = ( locale: FrontendLocaleData, config: HassConfig, entity: EntityRegistryDisplayEntry | undefined, + numeric_precision: number | undefined, state?: string, ): string => computeStateDisplayFromEntityAttributes( @@ -33,6 +34,7 @@ export const computeStateDisplaySingleEntity = ( entity, stateObj.entity_id, stateObj.attributes, + numeric_precision, state !== undefined ? state : stateObj.state, ); @@ -42,6 +44,7 @@ export const computeStateDisplay = ( locale: FrontendLocaleData, config: HassConfig, entities: HomeAssistant['entities'], + numeric_precision: number | undefined, state?: string, ): string => { const entity = entities[stateObj.entity_id] as EntityRegistryDisplayEntry | undefined; @@ -53,6 +56,7 @@ export const computeStateDisplay = ( entity, stateObj.entity_id, stateObj.attributes, + numeric_precision, state !== undefined ? state : stateObj.state, ); }; @@ -64,6 +68,7 @@ export const computeStateDisplayFromEntityAttributes = ( entity: EntityRegistryDisplayEntry | undefined, entityId: string, attributes: any, + numeric_precision: number | undefined, state: string, ): string => { if (state === UNKNOWN || state === UNAVAILABLE) { @@ -91,7 +96,7 @@ export const computeStateDisplayFromEntityAttributes = ( currency: attributes.unit_of_measurement, minimumFractionDigits: 2, // Override monetary options with number format - ...getNumberFormatOptions({ state, attributes } as HassEntity, entity), + ...getNumberFormatOptions({ state, attributes } as HassEntity, numeric_precision, entity), }); } catch (_err) { // fallback to default @@ -102,7 +107,11 @@ export const computeStateDisplayFromEntityAttributes = ( : attributes.unit_of_measurement === '%' ? blankBeforePercent(locale) + '%' : ` ${attributes.unit_of_measurement}`; - return `${formatNumber(state, locale, getNumberFormatOptions({ state, attributes } as HassEntity, entity))}${unit}`; + return `${formatNumber( + state, + locale, + getNumberFormatOptions({ state, attributes } as HassEntity, numeric_precision, entity), + )}${unit}`; } const domain = computeDomain(entityId); @@ -149,7 +158,11 @@ export const computeStateDisplayFromEntityAttributes = ( // `counter` `number` and `input_number` domains do not have a unit of measurement but should still use `formatNumber` if (domain === 'counter' || domain === 'number' || domain === 'input_number') { // Format as an integer if the value and step are integers - return formatNumber(state, locale, getNumberFormatOptions({ state, attributes } as HassEntity, entity)); + return formatNumber( + state, + locale, + getNumberFormatOptions({ state, attributes } as HassEntity, numeric_precision, entity), + ); } // state is a timestamp diff --git a/src/common/format_number.ts b/src/common/format_number.ts index bad171e..e1e96b9 100644 --- a/src/common/format_number.ts +++ b/src/common/format_number.ts @@ -89,9 +89,13 @@ export const formatNumber = ( */ export const getNumberFormatOptions = ( entityState: HassEntity, + numeric_precision: number | undefined, entity?: EntityRegistryDisplayEntry, ): Intl.NumberFormatOptions | undefined => { - const precision = entity?.display_precision; + let precision = entity?.display_precision; + if (numeric_precision !== undefined) { + precision = numeric_precision; + } if (precision != null) { return { maximumFractionDigits: precision, diff --git a/src/types/types.ts b/src/types/types.ts index 1058148..5222107 100644 --- a/src/types/types.ts +++ b/src/types/types.ts @@ -27,6 +27,7 @@ export interface ButtonCardConfig { show_label?: boolean; show_live_stream?: boolean; label?: string; + numeric_precision?: number; entity_picture?: string; units?: string; state_display?: string;