diff --git a/src/panels/config/entities/entity-registry-settings.ts b/src/panels/config/entities/entity-registry-settings.ts index 792c2f147a..da5b40359f 100644 --- a/src/panels/config/entities/entity-registry-settings.ts +++ b/src/panels/config/entities/entity-registry-settings.ts @@ -1,6 +1,5 @@ -import "@material/mwc-formfield/mwc-formfield"; -import "../../../components/ha-radio"; import "@material/mwc-button/mwc-button"; +import "@material/mwc-formfield/mwc-formfield"; import "@material/mwc-list/mwc-list-item"; import { HassEntity, UnsubscribeFunc } from "home-assistant-js-websocket"; import { @@ -20,9 +19,15 @@ import "../../../components/ha-alert"; import "../../../components/ha-area-picker"; import "../../../components/ha-expansion-panel"; import "../../../components/ha-icon-picker"; +import "../../../components/ha-radio"; import "../../../components/ha-select"; import "../../../components/ha-switch"; import "../../../components/ha-textfield"; +import { + ConfigEntry, + deleteConfigEntry, + getConfigEntries, +} from "../../../data/config_entries"; import { DeviceRegistryEntry, subscribeDeviceRegistry, @@ -34,6 +39,7 @@ import { removeEntityRegistryEntry, updateEntityRegistryEntry, } from "../../../data/entity_registry"; +import { showOptionsFlowDialog } from "../../../dialogs/config-flow/show-dialog-options-flow"; import { showAlertDialog, showConfirmationDialog, @@ -42,27 +48,39 @@ import { SubscribeMixin } from "../../../mixins/subscribe-mixin"; import { haStyle } from "../../../resources/styles"; import type { HomeAssistant } from "../../../types"; import { showDeviceRegistryDetailDialog } from "../devices/device-registry-detail/show-dialog-device-registry-detail"; -import { - ConfigEntry, - deleteConfigEntry, - getConfigEntries, -} from "../../../data/config_entries"; -import { showOptionsFlowDialog } from "../../../dialogs/config-flow/show-dialog-options-flow"; const OVERRIDE_DEVICE_CLASSES = { cover: [ - "awning", - "blind", - "curtain", - "damper", - "door", - "garage", - "gate", - "shade", - "shutter", - "window", + [ + "awning", + "blind", + "curtain", + "damper", + "door", + "garage", + "gate", + "shade", + "shutter", + "window", + ], + ], + binary_sensor: [ + ["lock"], // Lock + ["window", "door", "garage_door", "opening"], // Door + ["battery", "battery_charging"], // Battery + ["cold", "gas", "heat"], // Climate + ["running", "motion", "moving", "occupancy", "presence", "vibration"], // Presence + ["power", "plug", "light"], // Power + [ + "smoke", + "safety", + "sound", + "problem", + "tamper", + "carbon_monoxide", + "moisture", + ], // Alarm ], - binary_sensor: ["window", "door", "garage_door", "opening"], }; @customElement("entity-registry-settings") @@ -85,8 +103,6 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { @state() private _hiddenBy!: string | null; - private _deviceLookup?: Record; - @state() private _device?: DeviceRegistryEntry; @state() private _helperConfigEntry?: ConfigEntry; @@ -97,6 +113,10 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { private _origEntityId!: string; + private _deviceLookup?: Record; + + private _deviceClassOptions?: string[][]; + public hassSubscribe(): UnsubscribeFunc[] { return [ subscribeDeviceRegistry(this.hass.connection!, (devices) => { @@ -125,23 +145,41 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { } } - protected updated(changedProperties: PropertyValues) { - super.updated(changedProperties); - if (changedProperties.has("entry")) { - this._error = undefined; - this._name = this.entry.name || ""; - this._icon = this.entry.icon || ""; - this._deviceClass = - this.entry.device_class || this.entry.original_device_class; - this._origEntityId = this.entry.entity_id; - this._areaId = this.entry.area_id; - this._entityId = this.entry.entity_id; - this._disabledBy = this.entry.disabled_by; - this._hiddenBy = this.entry.hidden_by; - this._device = - this.entry.device_id && this._deviceLookup - ? this._deviceLookup[this.entry.device_id] - : undefined; + protected willUpdate(changedProperties: PropertyValues) { + super.willUpdate(changedProperties); + if (!changedProperties.has("entry")) { + return; + } + + this._error = undefined; + this._name = this.entry.name || ""; + this._icon = this.entry.icon || ""; + this._deviceClass = + this.entry.device_class || this.entry.original_device_class; + this._origEntityId = this.entry.entity_id; + this._areaId = this.entry.area_id; + this._entityId = this.entry.entity_id; + this._disabledBy = this.entry.disabled_by; + this._hiddenBy = this.entry.hidden_by; + this._device = + this.entry.device_id && this._deviceLookup + ? this._deviceLookup[this.entry.device_id] + : undefined; + + const domain = computeDomain(this.entry.entity_id); + const deviceClasses: string[][] = OVERRIDE_DEVICE_CLASSES[domain]; + + if (!deviceClasses) { + return; + } + + this._deviceClassOptions = [[], []]; + for (const deviceClass of deviceClasses) { + if (deviceClass.includes(this.entry.original_device_class!)) { + this._deviceClassOptions[0] = deviceClass; + } else { + this._deviceClassOptions[1].push(...deviceClass); + } } } @@ -197,28 +235,39 @@ export class EntityRegistrySettings extends SubscribeMixin(LitElement) { : undefined} .disabled=${this._submitting} > - ${OVERRIDE_DEVICE_CLASSES[domain]?.includes(this._deviceClass) || - (domain === "cover" && this.entry.original_device_class === null) - ? html` - ${OVERRIDE_DEVICE_CLASSES[domain].map( - (deviceClass: string) => html` - - ${this.hass.localize( - `ui.dialogs.entity_registry.editor.device_classes.${domain}.${deviceClass}` - )} - - ` - )} - ` + ${this._deviceClassOptions + ? html` + + ${this._deviceClassOptions[0].map( + (deviceClass: string) => html` + + ${this.hass.localize( + `ui.dialogs.entity_registry.editor.device_classes.${domain}.${deviceClass}` + )} + + ` + )} +
  • + ${this._deviceClassOptions[1].map( + (deviceClass: string) => html` + + ${this.hass.localize( + `ui.dialogs.entity_registry.editor.device_classes.${domain}.${deviceClass}` + )} + + ` + )} +
    + ` : ""}