diff --git a/src/components/ha-assist-chat.ts b/src/components/ha-assist-chat.ts
index b6e894fa5d..2fca50c4ae 100644
--- a/src/components/ha-assist-chat.ts
+++ b/src/components/ha-assist-chat.ts
@@ -29,6 +29,9 @@ export class HaAssistChat extends LitElement {
@property({ attribute: false }) public pipeline?: AssistPipeline;
+ @property({ type: Boolean, attribute: "disable-speech" })
+ public disableSpeech = false;
+
@property({ type: Boolean, attribute: false })
public startListening?: boolean;
@@ -103,7 +106,7 @@ export class HaAssistChat extends LitElement {
)
: true);
const supportsMicrophone = AudioRecorder.isSupported;
- const supportsSTT = this.pipeline?.stt_engine;
+ const supportsSTT = this.pipeline?.stt_engine && !this.disableSpeech;
return html`
${controlHA
diff --git a/src/dialogs/more-info/const.ts b/src/dialogs/more-info/const.ts
index 76b51ae791..7c77de80ce 100644
--- a/src/dialogs/more-info/const.ts
+++ b/src/dialogs/more-info/const.ts
@@ -22,6 +22,7 @@ export const DOMAINS_WITH_NEW_MORE_INFO = [
"alarm_control_panel",
"cover",
"climate",
+ "conversation",
"fan",
"humidifier",
"input_boolean",
@@ -43,6 +44,7 @@ export const DOMAINS_WITH_MORE_INFO = [
"camera",
"climate",
"configurator",
+ "conversation",
"counter",
"cover",
"date",
diff --git a/src/dialogs/more-info/controls/more-info-conversation.ts b/src/dialogs/more-info/controls/more-info-conversation.ts
new file mode 100644
index 0000000000..6fe8e20c56
--- /dev/null
+++ b/src/dialogs/more-info/controls/more-info-conversation.ts
@@ -0,0 +1,109 @@
+import type { HassEntity } from "home-assistant-js-websocket";
+import type { PropertyValues } from "lit";
+import { css, html, LitElement, nothing } from "lit";
+import { customElement, property, state } from "lit/decorators";
+import "../../../components/ha-attributes";
+import type { HomeAssistant } from "../../../types";
+import "../../../components/ha-assist-chat";
+import "../../../components/ha-circular-progress";
+import "../../../components/ha-alert";
+import type { AssistPipeline } from "../../../data/assist_pipeline";
+import { getAssistPipeline } from "../../../data/assist_pipeline";
+
+@customElement("more-info-conversation")
+class MoreInfoConversation extends LitElement {
+ @property({ attribute: false }) public hass!: HomeAssistant;
+
+ @property({ attribute: false }) public stateObj?: HassEntity;
+
+ @state() public _pipeline?: AssistPipeline;
+
+ @state() private _errorLoadAssist?: "not_found" | "unknown";
+
+ protected willUpdate(changedProperties: PropertyValues): void {
+ super.willUpdate(changedProperties);
+
+ if (!changedProperties.has("stateObj") || !this.stateObj) {
+ return;
+ }
+
+ const oldStateObj = changedProperties.get("stateObj") as
+ | HassEntity
+ | undefined;
+
+ if (!oldStateObj || oldStateObj.entity_id !== this.stateObj.entity_id) {
+ this._getPipeline();
+ }
+ }
+
+ private async _getPipeline() {
+ this._pipeline = undefined;
+ this._errorLoadAssist = undefined;
+ const pipelineId = this.stateObj!.entity_id;
+ try {
+ const pipeline = await getAssistPipeline(this.hass, pipelineId);
+ // Verify the pipeline is still the same.
+ if (this.stateObj && pipelineId === this.stateObj.entity_id) {
+ this._pipeline = pipeline;
+ }
+ } catch (e: any) {
+ if (this.stateObj && pipelineId !== this.stateObj.entity_id) {
+ return;
+ }
+
+ if (e.code === "not_found") {
+ this._errorLoadAssist = "not_found";
+ } else {
+ this._errorLoadAssist = "unknown";
+ // eslint-disable-next-line no-console
+ console.error(e);
+ }
+ }
+ }
+
+ protected render() {
+ if (!this.hass || !this.stateObj) {
+ return nothing;
+ }
+
+ return html`
+ ${this._errorLoadAssist
+ ? html`