From ffad6f340fa5ce9a8199267eef666c00798e2f13 Mon Sep 17 00:00:00 2001 From: Paulus Schoutsen Date: Thu, 1 Sep 2022 22:43:30 -0400 Subject: [PATCH] Fix some descriptions (#13562) --- src/data/automation_i18n.ts | 89 ++++++++++++++++++++++++++++++++----- src/data/script_i18n.ts | 38 ++++++++++------ 2 files changed, 103 insertions(+), 24 deletions(-) diff --git a/src/data/automation_i18n.ts b/src/data/automation_i18n.ts index d3b5fba7cd..1c7e8a1537 100644 --- a/src/data/automation_i18n.ts +++ b/src/data/automation_i18n.ts @@ -1,4 +1,5 @@ import secondsToDuration from "../common/datetime/seconds_to_duration"; +import { ensureArray } from "../common/ensure-array"; import { computeStateName } from "../common/entity/compute_state_name"; import type { HomeAssistant } from "../types"; import { Condition, Trigger } from "./automation"; @@ -74,7 +75,7 @@ export const describeTrigger = ( } // State Trigger - if (trigger.platform === "state" && trigger.entity_id) { + if (trigger.platform === "state") { let base = "When"; let entities = ""; @@ -95,12 +96,17 @@ export const describeTrigger = ( } ${computeStateName(states[entity]) || entity}`; } } - } else { + } else if (trigger.entity_id) { entities = states[trigger.entity_id] ? computeStateName(states[trigger.entity_id]) : trigger.entity_id; } + if (!entities) { + // no entity_id or empty array + entities = "something"; + } + base += ` ${entities} changes`; if (trigger.from) { @@ -286,7 +292,7 @@ export const describeTrigger = ( } // MQTT Trigger if (trigger.platform === "mqtt") { - return "When a MQTT payload has been received"; + return "When an MQTT message has been received"; } // Template Trigger @@ -300,6 +306,9 @@ export const describeTrigger = ( } if (trigger.platform === "device") { + if (!trigger.device_id) { + return "Device trigger"; + } const config = trigger as DeviceTrigger; const localized = localizeDeviceAutomationTrigger(hass, config); if (localized) { @@ -311,7 +320,9 @@ export const describeTrigger = ( }`; } - return `${trigger.platform || "Unknown"} trigger`; + return `${ + trigger.platform ? trigger.platform.replace(/_/g, " ") : "Unknown" + } trigger`; }; export const describeCondition = ( @@ -323,15 +334,64 @@ export const describeCondition = ( return condition.alias; } - if (["or", "and", "not"].includes(condition.condition)) { - return `multiple conditions using "${condition.condition}"`; + if (!condition.condition) { + const shorthands: Array<"and" | "or" | "not"> = ["and", "or", "not"]; + for (const key of shorthands) { + if (!(key in condition)) { + continue; + } + if (ensureArray(condition[key])) { + condition = { + condition: key, + conditions: condition[key], + }; + } + } + } + + if (condition.condition === "or") { + const conditions = ensureArray(condition.conditions); + + let count = "condition"; + + if (conditions && conditions.length > 0) { + count = `of ${conditions.length} conditions`; + } + + return `Test if any ${count} matches`; + } + + if (condition.condition === "and") { + const conditions = ensureArray(condition.conditions); + + const count = + conditions && conditions.length > 0 + ? `${conditions.length} ` + : "multiple"; + + return `Test if ${count} conditions match`; + } + + if (condition.condition === "not") { + const conditions = ensureArray(condition.conditions); + + const what = + conditions && conditions.length > 0 + ? `none of ${conditions.length} conditions match` + : "no condition matches"; + + return `Test if ${what}`; } // State Condition - if (condition.condition === "state" && condition.entity_id) { + if (condition.condition === "state") { let base = "Confirm"; const stateObj = hass.states[condition.entity_id]; - const entity = stateObj ? computeStateName(stateObj) : condition.entity_id; + const entity = stateObj + ? computeStateName(stateObj) + : condition.entity_id + ? condition.entity_id + : "an entity"; if ("attribute" in condition) { base += ` ${condition.attribute} from`; @@ -347,10 +407,14 @@ export const describeCondition = ( : "" } ${state}`; } - } else { + } else if (condition.state) { states = condition.state.toString(); } + if (!states) { + states = "a state"; + } + base += ` ${entity} is ${states}`; if ("for" in condition) { @@ -487,6 +551,9 @@ export const describeCondition = ( } if (condition.condition === "device") { + if (!condition.device_id) { + return "Device condition"; + } const config = condition as DeviceCondition; const localized = localizeDeviceAutomationCondition(hass, config); if (localized) { @@ -498,5 +565,7 @@ export const describeCondition = ( }`; } - return `${condition.condition} condition`; + return `${ + condition.condition ? condition.condition.replace(/_/g, " ") : "Unknown" + } condition`; }; diff --git a/src/data/script_i18n.ts b/src/data/script_i18n.ts index ffdb1b0b3b..69e85b69c2 100644 --- a/src/data/script_i18n.ts +++ b/src/data/script_i18n.ts @@ -61,7 +61,7 @@ export const describeAction = ( ? `${domainToName(hass.localize, domain)}: ${service.name}` : `Call service: ${config.service}`; } else { - return actionType; + return "Call a service"; } if (config.target) { const targets: string[] = []; @@ -137,9 +137,11 @@ export const describeAction = ( } else if (typeof config.delay === "string") { duration = isTemplate(config.delay) ? "based on a template" - : `for ${config.delay}`; - } else { + : `for ${config.delay || "a duration"}`; + } else if (config.delay) { duration = `for ${formatDuration(config.delay)}`; + } else { + duration = "for a duration"; } return `Delay ${duration}`; @@ -153,13 +155,12 @@ export const describeAction = ( } else { entityId = config.target?.entity_id || config.entity_id; } + if (!entityId) { + return "Activate a scene"; + } const sceneStateObj = entityId ? hass.states[entityId] : undefined; - return `Scene ${ - sceneStateObj - ? computeStateName(sceneStateObj) - : "scene" in config - ? config.scene - : config.target?.entity_id || config.entity_id || "" + return `Active scene ${ + sceneStateObj ? computeStateName(sceneStateObj) : entityId }`; } @@ -167,16 +168,22 @@ export const describeAction = ( const config = action as PlayMediaAction; const entityId = config.target?.entity_id || config.entity_id; const mediaStateObj = entityId ? hass.states[entityId] : undefined; - return `Play ${config.metadata.title || config.data.media_content_id} on ${ + return `Play ${ + config.metadata.title || config.data.media_content_id || "media" + } on ${ mediaStateObj ? computeStateName(mediaStateObj) - : config.target?.entity_id || config.entity_id + : entityId || "a media player" }`; } if (actionType === "wait_for_trigger") { const config = action as WaitForTriggerAction; - return `Wait for ${ensureArray(config.wait_for_trigger) + const triggers = ensureArray(config.wait_for_trigger); + if (!triggers || triggers.length === 0) { + return "Wait for a trigger"; + } + return `Wait for ${triggers .map((trigger) => describeTrigger(trigger, hass)) .join(", ")}`; } @@ -199,12 +206,12 @@ export const describeAction = ( } if (actionType === "check_condition") { - return `Test ${describeCondition(action as Condition, hass)}`; + return describeCondition(action as Condition, hass); } if (actionType === "stop") { const config = action as StopAction; - return `Stopped${config.stop ? ` because: ${config.stop}` : ""}`; + return `Stop${config.stop ? ` because: ${config.stop}` : ""}`; } if (actionType === "if") { @@ -258,6 +265,9 @@ export const describeAction = ( if (actionType === "device_action") { const config = action as DeviceAction; + if (!config.device_id) { + return "Device action"; + } const localized = localizeDeviceAutomationAction(hass, config); if (localized) { return localized;