diff --git a/lib/extension/homeassistant.ts b/lib/extension/homeassistant.ts index b4affc725b..87f84b48d6 100644 --- a/lib/extension/homeassistant.ts +++ b/lib/extension/homeassistant.ts @@ -885,25 +885,41 @@ export default class HomeAssistant extends Extension { }); } } else if (firstExpose.type === 'text' || firstExpose.type === 'composite' || firstExpose.type === 'list') { + // Deprecated: remove text sensor + const settableText = firstExpose.type === 'text' && firstExpose.access & ACCESS_SET; + const lookup: {[s: string]: KeyValue} = { + action: {icon: 'mdi:gesture-double-tap'}, + programming_mode: {icon: 'mdi:calendar-clock'}, + program: {value_template: `{{ value_json.${firstExpose.property}|default("") ` + + `| truncate(254, True, '', 0) }}`}, + }; if (firstExpose.access & ACCESS_STATE) { - const lookup: {[s: string]: KeyValue} = { - action: {icon: 'mdi:gesture-double-tap'}, - programming_mode: {icon: 'mdi:calendar-clock'}, - program: {value_template: `{{ value_json.${firstExpose.property}|default("") ` + - `| truncate(254, True, '', 0) }}`}, - }; - const discoveryEntry: DiscoveryEntry = { type: 'sensor', object_id: firstExpose.property, mockProperties: [{property: firstExpose.property, value: null}], discovery_payload: { value_template: `{{ value_json.${firstExpose.property} }}`, + enabled_by_default: !settableText, ...lookup[firstExpose.name], }, }; discoveryEntries.push(discoveryEntry); } + if (settableText) { + discoveryEntries.push({ + type: 'text', + object_id: firstExpose.property, + mockProperties: [], // Already mocked above in case access STATE is supported + discovery_payload: { + value_template: `{{ value_json.${firstExpose.property} }}`, + command_topic_prefix: endpoint, + command_topic: true, + command_topic_postfix: firstExpose.property, + ...lookup[firstExpose.name], + }, + }); + } } else { throw new Error(`Unsupported exposes type: '${firstExpose.type}'`); }