({
+ type: "device_automation/trigger/list",
+ device_id: deviceId,
+ })
+ .then((response) => response.triggers);
+
+export const deviceAutomationTriggersEqual = (
+ a: DeviceTrigger,
+ b: DeviceTrigger
+) => {
+ if (typeof a !== typeof b) {
+ return false;
+ }
+
+ for (const property in a) {
+ if (!Object.is(a[property], b[property])) {
+ return false;
+ }
+ }
+ for (const property in b) {
+ if (!Object.is(a[property], b[property])) {
+ return false;
+ }
+ }
+
+ return true;
+};
+
+export const localizeDeviceAutomationTrigger = (
+ hass: HomeAssistant,
+ trigger: DeviceTrigger
+) =>
+ hass.localize(
+ `component.${trigger.domain}.device_automation.trigger_type.${
+ trigger.type
+ }`,
+ "name",
+ trigger.entity_id ? compute_state_name(hass!.states[trigger.entity_id]) : ""
+ );
diff --git a/src/dialogs/more-info/controls/more-info-fan.js b/src/dialogs/more-info/controls/more-info-fan.js
index 4df080e319..8bd690ae5b 100644
--- a/src/dialogs/more-info/controls/more-info-fan.js
+++ b/src/dialogs/more-info/controls/more-info-fan.js
@@ -81,15 +81,15 @@ class MoreInfoFan extends LocalizeMixin(EventsMixin(PolymerElement)) {
[[localize('ui.card.fan.direction')]]
@@ -164,25 +164,25 @@ class MoreInfoFan extends LocalizeMixin(EventsMixin(PolymerElement)) {
});
}
- onDirectionLeft() {
+ onDirectionReverse() {
this.hass.callService("fan", "set_direction", {
entity_id: this.stateObj.entity_id,
direction: "reverse",
});
}
- onDirectionRight() {
+ onDirectionForward() {
this.hass.callService("fan", "set_direction", {
entity_id: this.stateObj.entity_id,
direction: "forward",
});
}
- computeIsRotatingLeft(stateObj) {
+ computeIsRotatingReverse(stateObj) {
return stateObj.attributes.direction === "reverse";
}
- computeIsRotatingRight(stateObj) {
+ computeIsRotatingForward(stateObj) {
return stateObj.attributes.direction === "forward";
}
}
diff --git a/src/dialogs/notifications/persistent-notification-item.ts b/src/dialogs/notifications/persistent-notification-item.ts
index b40a743203..9ddb665718 100644
--- a/src/dialogs/notifications/persistent-notification-item.ts
+++ b/src/dialogs/notifications/persistent-notification-item.ts
@@ -73,6 +73,9 @@ export class HuiPersistentNotificationItem extends LitElement {
a {
color: var(--primary-color);
}
+ ha-markdown {
+ overflow-wrap: break-word;
+ }
`;
}
diff --git a/src/panels/config/integrations/ha-config-entries-dashboard.js b/src/panels/config/integrations/ha-config-entries-dashboard.js
index d7c6113afb..0a2159a45a 100644
--- a/src/panels/config/integrations/ha-config-entries-dashboard.js
+++ b/src/panels/config/integrations/ha-config-entries-dashboard.js
@@ -126,10 +126,7 @@ class HaConfigManagerDashboard extends LocalizeMixin(
items="[[_computeConfigEntryEntities(hass, item, entities)]]"
>
-
+
[[_computeStateName(item)]]
@@ -230,10 +227,6 @@ class HaConfigManagerDashboard extends LocalizeMixin(
return computeStateName(stateObj);
}
- _handleMoreInfo(ev) {
- this.fire("hass-more-info", { entityId: ev.model.item.entity_id });
- }
-
_computeRTL(hass) {
return computeRTL(hass);
}
diff --git a/src/panels/config/js/trigger/device.js b/src/panels/config/js/trigger/device.js
new file mode 100644
index 0000000000..504eabdb7a
--- /dev/null
+++ b/src/panels/config/js/trigger/device.js
@@ -0,0 +1,52 @@
+import { h, Component } from "preact";
+
+import "../../../../components/device/ha-device-picker";
+import "../../../../components/device/ha-device-trigger-picker";
+
+import { onChangeEvent } from "../../../../common/preact/event";
+
+export default class DeviceTrigger extends Component {
+ constructor() {
+ super();
+ this.onChange = onChangeEvent.bind(this, "trigger");
+ this.devicePicked = this.devicePicked.bind(this);
+ this.deviceTriggerPicked = this.deviceTriggerPicked.bind(this);
+ this.state.device_id = undefined;
+ }
+
+ devicePicked(ev) {
+ this.setState({ device_id: ev.target.value });
+ }
+
+ deviceTriggerPicked(ev) {
+ const deviceTrigger = ev.target.value;
+ this.props.onChange(this.props.index, (this.props.trigger = deviceTrigger));
+ }
+
+ /* eslint-disable camelcase */
+ render({ trigger, hass }, { device_id }) {
+ if (device_id === undefined) device_id = trigger.device_id;
+
+ return (
+
+
+
+
+ );
+ }
+}
+
+DeviceTrigger.defaultConfig = {
+ device_id: "",
+};
diff --git a/src/panels/config/js/trigger/trigger_edit.js b/src/panels/config/js/trigger/trigger_edit.js
index 443c094a3a..e0234ed550 100644
--- a/src/panels/config/js/trigger/trigger_edit.js
+++ b/src/panels/config/js/trigger/trigger_edit.js
@@ -4,6 +4,7 @@ import "@polymer/paper-dropdown-menu/paper-dropdown-menu-light";
import "@polymer/paper-item/paper-item";
import "@polymer/paper-listbox/paper-listbox";
+import DeviceTrigger from "./device";
import EventTrigger from "./event";
import GeolocationTrigger from "./geo_location";
import HassTrigger from "./homeassistant";
@@ -18,6 +19,7 @@ import WebhookTrigger from "./webhook";
import ZoneTrigger from "./zone";
const TYPES = {
+ device: DeviceTrigger,
event: EventTrigger,
state: StateTrigger,
geo_location: GeolocationTrigger,
diff --git a/src/panels/config/server_control/ha-config-section-server-control.js b/src/panels/config/server_control/ha-config-section-server-control.js
index d1e7fb9c41..6382de6c5e 100644
--- a/src/panels/config/server_control/ha-config-section-server-control.js
+++ b/src/panels/config/server_control/ha-config-section-server-control.js
@@ -150,6 +150,7 @@ class HaConfigSectionServerControl extends LocalizeMixin(PolymerElement) {
hass="[[hass]]"
domain="homeassistant"
service="restart"
+ confirmation="[[localize('ui.panel.config.server_control.section.server_management.confirm_restart')]]"
>[[localize('ui.panel.config.server_control.section.server_management.restart')]]
[[localize('ui.panel.config.server_control.section.server_management.stop')]]
diff --git a/src/panels/developer-tools/developer-tools-router.ts b/src/panels/developer-tools/developer-tools-router.ts
index 924c82232e..7af7705ac1 100644
--- a/src/panels/developer-tools/developer-tools-router.ts
+++ b/src/panels/developer-tools/developer-tools-router.ts
@@ -28,6 +28,10 @@ class DeveloperToolsRouter extends HassRouterPage {
tag: "developer-tools-info",
load: () => import("./info/developer-tools-info"),
},
+ logs: {
+ tag: "developer-tools-logs",
+ load: () => import("./logs/developer-tools-logs"),
+ },
mqtt: {
tag: "developer-tools-mqtt",
load: () => import("./mqtt/developer-tools-mqtt"),
diff --git a/src/panels/developer-tools/ha-panel-developer-tools.ts b/src/panels/developer-tools/ha-panel-developer-tools.ts
index f982cc1f1a..edb2236237 100644
--- a/src/panels/developer-tools/ha-panel-developer-tools.ts
+++ b/src/panels/developer-tools/ha-panel-developer-tools.ts
@@ -52,6 +52,9 @@ class PanelDeveloperTools extends LitElement {
${this.hass.localize("ui.panel.developer-tools.tabs.info.title")}
+
+ ${this.hass.localize("ui.panel.developer-tools.tabs.logs.title")}
+
${this.hass.localize(
"ui.panel.developer-tools.tabs.events.title"
diff --git a/src/panels/developer-tools/info/developer-tools-info.ts b/src/panels/developer-tools/info/developer-tools-info.ts
index f9b1be82f0..3c021f7c57 100644
--- a/src/panels/developer-tools/info/developer-tools-info.ts
+++ b/src/panels/developer-tools/info/developer-tools-info.ts
@@ -10,8 +10,6 @@ import {
import { HomeAssistant } from "../../../types";
import { haStyle } from "../../../resources/styles";
-import "./system-log-card";
-import "./error-log-card";
import "./system-health-card";
const JS_TYPE = __BUILD__;
@@ -119,8 +117,6 @@ class HaPanelDevInfo extends LitElement {
-
-
`;
}
@@ -181,6 +177,7 @@ class HaPanelDevInfo extends LitElement {
display: block;
max-width: 600px;
margin: 0 auto;
+ padding-bottom: 16px;
}
`,
];
diff --git a/src/panels/developer-tools/logs/developer-tools-logs.ts b/src/panels/developer-tools/logs/developer-tools-logs.ts
new file mode 100644
index 0000000000..6bc7190ffd
--- /dev/null
+++ b/src/panels/developer-tools/logs/developer-tools-logs.ts
@@ -0,0 +1,52 @@
+import {
+ LitElement,
+ html,
+ CSSResult,
+ css,
+ TemplateResult,
+ property,
+} from "lit-element";
+
+import { HomeAssistant } from "../../../types";
+import { haStyle } from "../../../resources/styles";
+
+import "../logs/system-log-card";
+import "../logs/error-log-card";
+
+class HaPanelDevLogs extends LitElement {
+ @property() public hass!: HomeAssistant;
+
+ protected render(): TemplateResult | void {
+ return html`
+
+
+
+
+ `;
+ }
+
+ static get styles(): CSSResult[] {
+ return [
+ haStyle,
+ css`
+ :host {
+ -ms-user-select: initial;
+ -webkit-user-select: initial;
+ -moz-user-select: initial;
+ }
+
+ .content {
+ direction: ltr;
+ }
+ `,
+ ];
+ }
+}
+
+declare global {
+ interface HTMLElementTagNameMap {
+ "developer-tools-logs": HaPanelDevLogs;
+ }
+}
+
+customElements.define("developer-tools-logs", HaPanelDevLogs);
diff --git a/src/panels/developer-tools/info/dialog-system-log-detail.ts b/src/panels/developer-tools/logs/dialog-system-log-detail.ts
similarity index 100%
rename from src/panels/developer-tools/info/dialog-system-log-detail.ts
rename to src/panels/developer-tools/logs/dialog-system-log-detail.ts
diff --git a/src/panels/developer-tools/info/error-log-card.ts b/src/panels/developer-tools/logs/error-log-card.ts
similarity index 100%
rename from src/panels/developer-tools/info/error-log-card.ts
rename to src/panels/developer-tools/logs/error-log-card.ts
diff --git a/src/panels/developer-tools/info/show-dialog-system-log-detail.ts b/src/panels/developer-tools/logs/show-dialog-system-log-detail.ts
similarity index 100%
rename from src/panels/developer-tools/info/show-dialog-system-log-detail.ts
rename to src/panels/developer-tools/logs/show-dialog-system-log-detail.ts
diff --git a/src/panels/developer-tools/info/system-log-card.ts b/src/panels/developer-tools/logs/system-log-card.ts
similarity index 98%
rename from src/panels/developer-tools/info/system-log-card.ts
rename to src/panels/developer-tools/logs/system-log-card.ts
index e3800dcfec..1d3e264e46 100644
--- a/src/panels/developer-tools/info/system-log-card.ts
+++ b/src/panels/developer-tools/logs/system-log-card.ts
@@ -141,8 +141,6 @@ class SystemLogCard extends LitElement {
.system-log-intro {
margin: 16px;
- border-top: 1px solid var(--light-primary-color);
- padding-top: 16px;
}
.loading-container {
diff --git a/src/panels/lovelace/cards/hui-alarm-panel-card.ts b/src/panels/lovelace/cards/hui-alarm-panel-card.ts
index 8b99421f7e..899a2c6eb9 100644
--- a/src/panels/lovelace/cards/hui-alarm-panel-card.ts
+++ b/src/panels/lovelace/cards/hui-alarm-panel-card.ts
@@ -114,7 +114,11 @@ class HuiAlarmPanelCard extends LitElement implements LovelaceCard {
}
return html`
-
+