Update version to 0.1.36 and enhance changelog with fixes for voice mode and message deduplication

This commit is contained in:
techartdev
2026-02-20 22:18:05 +02:00
parent fa29b67eee
commit bfd973bbff
5 changed files with 23 additions and 11 deletions
+6
View File
@@ -2,6 +2,12 @@
All notable changes to the OpenClaw Home Assistant Integration will be documented in this file. All notable changes to the OpenClaw Home Assistant Integration will be documented in this file.
## [0.1.36] - 2026-02-20
### Fixed
- Voice mode now auto-falls back to browser speech when `voice_provider` is `assist_stt`, instead of blocking continuous mode with an error message.
- Reduced duplicated assistant replies in the chat card by deduplicating repeated `openclaw_message_received` payloads.
## [0.1.35] - 2026-02-20 ## [0.1.35] - 2026-02-20
### Fixed ### Fixed
+1 -1
View File
@@ -78,7 +78,7 @@ _CARD_PATH = Path(__file__).parent / "www" / _CARD_FILENAME
# URL at which the card JS is served (registered via register_static_path) # URL at which the card JS is served (registered via register_static_path)
_CARD_STATIC_URL = f"/openclaw/{_CARD_FILENAME}" _CARD_STATIC_URL = f"/openclaw/{_CARD_FILENAME}"
# Versioned URL used for Lovelace resource registration to avoid stale browser cache # Versioned URL used for Lovelace resource registration to avoid stale browser cache
_CARD_URL = f"{_CARD_STATIC_URL}?v=0.1.35" _CARD_URL = f"{_CARD_STATIC_URL}?v=0.1.36"
OpenClawConfigEntry = ConfigEntry OpenClawConfigEntry = ConfigEntry
+1 -1
View File
@@ -8,7 +8,7 @@
"iot_class": "local_polling", "iot_class": "local_polling",
"issue_tracker": "https://github.com/techartdev/OpenClawHomeAssistant/issues", "issue_tracker": "https://github.com/techartdev/OpenClawHomeAssistant/issues",
"requirements": [], "requirements": [],
"version": "0.1.35", "version": "0.1.36",
"dependencies": ["conversation"], "dependencies": ["conversation"],
"after_dependencies": ["hassio", "lovelace"] "after_dependencies": ["hassio", "lovelace"]
} }
@@ -13,7 +13,7 @@
* + subscribes to openclaw_message_received events. * + subscribes to openclaw_message_received events.
*/ */
const CARD_VERSION = "0.3.3"; const CARD_VERSION = "0.3.4";
// Max time (ms) to show the thinking indicator before falling back to an error // Max time (ms) to show the thinking indicator before falling back to an error
const THINKING_TIMEOUT_MS = 120_000; const THINKING_TIMEOUT_MS = 120_000;
@@ -86,6 +86,7 @@ class OpenClawChatCard extends HTMLElement {
this._assistAudioChunks = []; this._assistAudioChunks = [];
this._assistInputSampleRate = 16000; this._assistInputSampleRate = 16000;
this._assistAutoStopTimer = null; this._assistAutoStopTimer = null;
this._lastAssistantEventSignature = null;
} }
// ── HA card interface ─────────────────────────────────────────────── // ── HA card interface ───────────────────────────────────────────────
@@ -181,6 +182,12 @@ class OpenClawChatCard extends HTMLElement {
const sessionId = this._getSessionId(); const sessionId = this._getSessionId();
if (data.session_id && data.session_id !== sessionId) return; if (data.session_id && data.session_id !== sessionId) return;
const signature = `${sessionId}|${data.timestamp || ""}|${String(data.message)}`;
if (signature === this._lastAssistantEventSignature) {
return;
}
this._lastAssistantEventSignature = signature;
const thinkingIdx = this._messages.findIndex((m) => m._thinking); const thinkingIdx = this._messages.findIndex((m) => m._thinking);
if (thinkingIdx >= 0) { if (thinkingIdx >= 0) {
this._messages[thinkingIdx] = { this._messages[thinkingIdx] = {
@@ -569,6 +576,12 @@ class OpenClawChatCard extends HTMLElement {
_startVoiceRecognition() { _startVoiceRecognition() {
const provider = this._getVoiceProvider(); const provider = this._getVoiceProvider();
if (this._isVoiceMode && provider === "assist_stt") {
this._voiceStatus =
"Voice mode uses browser speech for continuous listening (Assist STT remains available for manual mic).";
this._startBrowserVoiceRecognition();
return;
}
if (provider === "assist_stt") { if (provider === "assist_stt") {
this._startAssistSttRecognition(); this._startAssistSttRecognition();
return; return;
@@ -1150,13 +1163,6 @@ class OpenClawChatCard extends HTMLElement {
} }
_toggleVoiceMode() { _toggleVoiceMode() {
if (!this._isVoiceMode && this._getVoiceProvider() === "assist_stt") {
this._voiceStatus =
"Continuous voice mode is only available with browser voice provider.";
this._render();
return;
}
this._isVoiceMode = !this._isVoiceMode; this._isVoiceMode = !this._isVoiceMode;
if (this._isVoiceMode) { if (this._isVoiceMode) {
this._startVoiceRecognition(); this._startVoiceRecognition();
+1 -1
View File
@@ -1,7 +1,7 @@
(async () => { (async () => {
try { try {
if (!customElements.get("openclaw-chat-card")) { if (!customElements.get("openclaw-chat-card")) {
const src = "/openclaw/openclaw-chat-card.js?v=0.1.35"; const src = "/openclaw/openclaw-chat-card.js?v=0.1.36";
console.info("OpenClaw loader importing", src); console.info("OpenClaw loader importing", src);
await import(src); await import(src);
} }