diff --git a/src/data/entity_registry.ts b/src/data/entity_registry.ts index cbc5459b3b..7b6a34a1d3 100644 --- a/src/data/entity_registry.ts +++ b/src/data/entity_registry.ts @@ -30,6 +30,7 @@ export interface ExtEntityRegistryEntry extends EntityRegistryEntry { device_class?: string; original_device_class?: string; aliases: string[]; + options: EntityRegistryOptions | null; } export interface UpdateEntityRegistryEntryResult { @@ -39,6 +40,7 @@ export interface UpdateEntityRegistryEntryResult { } export interface SensorEntityOptions { + precision?: number | null; unit_of_measurement?: string | null; } @@ -54,6 +56,12 @@ export interface WeatherEntityOptions { wind_speed_unit?: string | null; } +export interface EntityRegistryOptions { + number?: NumberEntityOptions; + sensor?: SensorEntityOptions; + weather?: WeatherEntityOptions; +} + export interface EntityRegistryEntryUpdateParams { name?: string | null; icon?: string | null; diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index 0abb81988c..f6897d1f43 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -62,6 +62,7 @@ import { EntityRegistryEntry, EntityRegistryEntryUpdateParams, ExtEntityRegistryEntry, + SensorEntityOptions, fetchEntityRegistry, removeEntityRegistryEntry, updateEntityRegistryEntry, @@ -125,6 +126,16 @@ const OVERRIDE_WEATHER_UNITS = { const SWITCH_AS_DOMAINS = ["cover", "fan", "light", "lock", "siren"]; +const PRECISIONS = [0, 1, 2, 3, 4, 5, 6]; + +function precisionLabel(precision: number, _state?: string) { + const state_float = + _state === undefined || isNaN(parseFloat(_state)) + ? 0.0 + : parseFloat(_state); + return state_float.toFixed(precision); +} + @customElement("entity-registry-settings") export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @property({ attribute: false }) public hass!: HomeAssistant; @@ -153,6 +164,8 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @state() private _unit_of_measurement?: string | null; + @state() private _precision?: number | null; + @state() private _precipitation_unit?: string | null; @state() private _pressure_unit?: string | null; @@ -250,6 +263,10 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { this._unit_of_measurement = stateObj?.attributes?.unit_of_measurement; } + if (domain === "sensor") { + this._precision = this.entry.options?.sensor?.precision; + } + if (domain === "weather") { const stateObj: HassEntity | undefined = this.hass.states[this.entry.entity_id]; @@ -467,6 +484,44 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { ` : ""} + ${domain === "sensor" && + // Allow customizing the precision for a sensor with numerical device class, + // a unit of measurement or state class + ((this._deviceClass && + !["date", "enum", "timestamp"].includes(this._deviceClass)) || + stateObj?.attributes.unit_of_measurement || + stateObj?.attributes.state_class) + ? html` + + ${this.hass.localize( + "ui.dialogs.entity_registry.editor.precision_default" + )} + ${PRECISIONS.map( + (precision) => html` + + ${precisionLabel( + precision, + this.hass.states[this.entry.entity_id]?.state + )} + + ` + )} + + ` + : ""} ${domain === "weather" ? html`