My heating wasn't working, so I tried the Hive smart home assistant. It can actually check your thermostat via API — pretty cool.
It also takes 70 seconds to respond. And when you tell it you're unhappy, it says:
"I notice you seem unhappy."
So I rebuilt it. You can try it yourself:
👉 Launch the demo on Hello Rasa
The Problems
1. Painfully slow
Every response — even "hello" — took 10-12 seconds. The API call took 70 seconds with no feedback. Just... waiting.
2. Dead ends
Ask something out of scope and you get:
"Sorry, I cannot answer."
Full stop. No alternatives. No path forward.
3. Inconsistent capabilities
It checked my thermostat once. Then later, when I asked explicitly, it said it couldn't check the thermostat. Same bot. Same session. Trust: broken.
4. Robotic tone
"I notice you seem unhappy" sounds like a sentiment classifier readout, not a conversation.
The Fixes
Instant acknowledgment
The fix is simple — acknowledge immediately, then do the slow work:
flows:
check_heating:
description: user wants to check their heating system
steps:
- action: utter_checking_heating # "Let me check..." (instant)
- action: action_check_heating_system # API call
- if: slots.heating_active
then:
- action: utter_heating_on
else:
- action: utter_heating_off
That's it. A flow that describes the business logic. The user sees "Let me check your heating system" immediately. They'll wait for the API.
No dead ends
When I asked the original bot to "set it to 25 degrees", I got:
"Sorry, I cannot answer."
That's a wall. The fix — a rephraser that acknowledges what they actually asked for:
utter_unsupported_action:
- text: "I'm sorry but that's not something I can do"
metadata:
rephrase: True
rephrase_prompt: |
Rephrase this to acknowledge what the user was asking for.
Now when I ask "set it to 25", I get: "I can't adjust the temperature for you, but I can check if the heating's working."
Consistent capabilities
The original bot sometimes said it could check the thermostat, sometimes said it couldn't. The fix: a custom action that actually does the thing.
class ActionCheckHeatingSystem(Action):
async def run(self, dispatcher, tracker, domain):
data = await self._fetch_thermostat_status(user_id)
return [
SlotSet("thermostat_online", data["thermostat_online"]),
SlotSet("current_temp", data["current_temp"]),
SlotSet("heating_active", data["heating_active"]),
]
The flow calls the action. The action returns slots. The flow decides what to say based on those slots. Simple.
Human tone
The rephraser transforms robotic responses into natural ones:
| Request | Before | After |
|---|---|---|
| "Set it to 25" | "Sorry, I cannot answer." | "I can't adjust the temperature, but I can check if it's working." |
| "Check my heating" | "Your heating is ON. Current temp is 18.5°C." | "The heating's running — sitting at 18.5°C, heading for 21°C." |
| ":(" | "I notice you seem unhappy." | "That sounds frustrating — let me see what I can do." |
Same capabilities. Human delivery.
The Patterns
These work for any conversational AI:
- Acknowledge instantly — even if the real work takes time
- No dead ends — always give the user a path forward
- Use a rephraser — make functional responses sound human
- Flows over intents — describe what should happen, not every way someone might ask
The whole skill is ~100 lines of YAML and one Python file. Fork it and build your own.
Top comments (0)