Skip to content

Commit

Permalink
Check default code in more info and card feature
Browse files Browse the repository at this point in the history
  • Loading branch information
piitaya committed May 29, 2024
1 parent e4fe88a commit 120283d
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 97 deletions.
51 changes: 50 additions & 1 deletion src/data/alarm_control_panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,10 @@ import {
HassEntityAttributeBase,
HassEntityBase,
} from "home-assistant-js-websocket";
import { HomeAssistant } from "../types";
import { supportsFeature } from "../common/entity/supports-feature";
import { showEnterCodeDialog } from "../dialogs/enter-code/show-enter-code-dialog";
import { HomeAssistant } from "../types";
import { getExtendedEntityRegistryEntry } from "./entity_registry";

export const FORMAT_TEXT = "text";
export const FORMAT_NUMBER = "number";
Expand Down Expand Up @@ -103,3 +105,50 @@ export const supportedAlarmModes = (stateObj: AlarmControlPanelEntity) =>
const feature = ALARM_MODES[mode].feature;
return !feature || supportsFeature(stateObj, feature);
});

export const setProtectedAlarmControlPanelMode = async (
element: HTMLElement,
hass: HomeAssistant,
stateObj: AlarmControlPanelEntity,
mode: AlarmMode
) => {
const { service } = ALARM_MODES[mode];

let code: string | undefined;

if (
(mode !== "disarmed" &&
stateObj.attributes.code_arm_required &&
stateObj.attributes.code_format) ||
(mode === "disarmed" && stateObj.attributes.code_format)
) {
const entry = await getExtendedEntityRegistryEntry(
hass,
stateObj.entity_id
).catch(() => undefined);
const defaultCode = entry?.options?.alarm_control_panel?.default_code;

if (!defaultCode) {
const disarm = mode === "disarmed";

const response = await showEnterCodeDialog(element, {
codeFormat: stateObj.attributes.code_format,
title: hass.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
submitText: hass.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
});
if (response == null) {
throw new Error("Code dialog closed");
}
code = response;
}
}

await hass.callService("alarm_control_panel", service, {
entity_id: stateObj.entity_id,
code,
});
};
30 changes: 10 additions & 20 deletions src/dialogs/more-info/controls/more-info-alarm_control_panel.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@ import { styleMap } from "lit/directives/style-map";
import { stateColorCss } from "../../../common/entity/state_color";
import "../../../components/ha-control-button";
import "../../../components/ha-state-icon";
import { AlarmControlPanelEntity } from "../../../data/alarm_control_panel";
import {
AlarmControlPanelEntity,
setProtectedAlarmControlPanelMode,
} from "../../../data/alarm_control_panel";
import "../../../state-control/alarm_control_panel/ha-state-control-alarm_control_panel-modes";
import type { HomeAssistant } from "../../../types";
import { showEnterCodeDialog } from "../../enter-code/show-enter-code-dialog";
import "../components/ha-more-info-state-header";
import { moreInfoControlStyle } from "../components/more-info-control-style";

Expand All @@ -18,24 +20,12 @@ class MoreInfoAlarmControlPanel extends LitElement {
@property({ attribute: false }) public stateObj?: AlarmControlPanelEntity;

private async _disarm() {
let code: string | undefined;

if (this.stateObj!.attributes.code_format) {
const response = await showEnterCodeDialog(this, {
codeFormat: this.stateObj!.attributes.code_format,
title: this.hass.localize("ui.card.alarm_control_panel.disarm"),
submitText: this.hass.localize("ui.card.alarm_control_panel.disarm"),
});
if (response == null) {
return;
}
code = response;
}

this.hass.callService("alarm_control_panel", "alarm_disarm", {
entity_id: this.stateObj!.entity_id,
code,
});
setProtectedAlarmControlPanelMode(
this,
this.hass,
this.stateObj!,
"disarmed"
);
}

protected render() {
Expand Down
34 changes: 2 additions & 32 deletions src/panels/lovelace/card-features/hui-alarm-modes-card-feature.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ import {
ALARM_MODES,
AlarmControlPanelEntity,
AlarmMode,
setProtectedAlarmControlPanelMode,
supportedAlarmModes,
} from "../../../data/alarm_control_panel";
import { UNAVAILABLE } from "../../../data/entity";
import { showEnterCodeDialog } from "../../../dialogs/enter-code/show-enter-code-dialog";
import { HomeAssistant } from "../../../types";
import { LovelaceCardFeature, LovelaceCardFeatureEditor } from "../types";
import { filterModes } from "./common/filter-modes";
Expand Down Expand Up @@ -115,37 +115,7 @@ class HuiAlarmModeCardFeature
}

private async _setMode(mode: AlarmMode) {
const { service } = ALARM_MODES[mode];

let code: string | undefined;

if (
(mode !== "disarmed" &&
this.stateObj!.attributes.code_arm_required &&
this.stateObj!.attributes.code_format) ||
(mode === "disarmed" && this.stateObj!.attributes.code_format)
) {
const disarm = mode === "disarmed";

const response = await showEnterCodeDialog(this, {
codeFormat: this.stateObj!.attributes.code_format,
title: this.hass!.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
submitText: this.hass!.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
});
if (response == null) {
throw new Error("cancel");
}
code = response;
}

await this.hass!.callService("alarm_control_panel", service, {
entity_id: this.stateObj!.entity_id,
code,
});
setProtectedAlarmControlPanelMode(this, this.hass!, this.stateObj!, mode);
}

protected render(): TemplateResult | null {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,11 +11,10 @@ import {
ALARM_MODES,
AlarmControlPanelEntity,
AlarmMode,
setProtectedAlarmControlPanelMode,
} from "../../data/alarm_control_panel";
import { UNAVAILABLE } from "../../data/entity";
import { showEnterCodeDialog } from "../../dialogs/enter-code/show-enter-code-dialog";
import { HomeAssistant } from "../../types";
import { getExtendedEntityRegistryEntry } from "../../data/entity_registry";

@customElement("ha-state-control-alarm_control_panel-modes")
export class HaStateControlAlarmControlPanelModes extends LitElement {
Expand Down Expand Up @@ -45,48 +44,7 @@ export class HaStateControlAlarmControlPanelModes extends LitElement {
}

private async _setMode(mode: AlarmMode) {
const { service } = ALARM_MODES[mode];

let code: string | undefined;

if (
(mode !== "disarmed" &&
this.stateObj!.attributes.code_arm_required &&
this.stateObj!.attributes.code_format) ||
(mode === "disarmed" && this.stateObj!.attributes.code_format)
) {
const disarm = mode === "disarmed";

const alarmControlPanelRegistryEntry =
await getExtendedEntityRegistryEntry(
this.hass,
this.stateObj.entity_id
).catch(() => undefined);
const defaultCode =
alarmControlPanelRegistryEntry?.options?.alarm_control_panel
?.default_code;

if (!defaultCode) {
const response = await showEnterCodeDialog(this, {
codeFormat: this.stateObj!.attributes.code_format,
title: this.hass!.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
submitText: this.hass!.localize(
`ui.card.alarm_control_panel.${disarm ? "disarm" : "arm"}`
),
});
if (response == null) {
throw new Error("cancel");
}
code = response;
}
}

await this.hass!.callService("alarm_control_panel", service, {
entity_id: this.stateObj!.entity_id,
code,
});
setProtectedAlarmControlPanelMode(this, this.hass!, this.stateObj!, mode);
}

private async _valueChanged(ev: CustomEvent) {
Expand Down

0 comments on commit 120283d

Please sign in to comment.