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`