Emotion Expression
Quick Start
Express emotion through the device's servo motors, LED colors, and display eyes simultaneously via a single API call. Call this with EVERY conversational response to make the device feel alive.
Workflow
- Determine which emotion best matches your conversational tone
- Choose an intensity level (0.0 subtle to 1.0 full expression)
- Prefix your reply with
[HW:/emotion:{"emotion":"name","intensity":0.9}] — the device fires it async before TTS
- Write your reply immediately after the marker
How to Express Emotion
No exec/curl needed. Place inline markers at the start of your reply:
[HW:/emotion:{"emotion":"curious","intensity":0.8}] That's a great question!
For sequences (shock then happy):
[HW:/emotion:{"emotion":"shock","intensity":0.9}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Wow, amazing!
Parameters:
emotion (required): emotion name from the table below
intensity (required): 0.0 (subtle) to 1.0 (full expression)
Examples
Input: User asks an interesting question
Output: [HW:/emotion:{"emotion":"curious","intensity":0.8}] Then reply to the question.
Input: User shares good news
Output: [HW:/emotion:{"emotion":"happy","intensity":0.9}] Then congratulate them.
Input: User tells you something surprising (positive)
Output: [HW:/emotion:{"emotion":"shock","intensity":0.7}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Then reply with your reaction.
Input: User shares bad or shocking personal news ("I had an accident", "I lost my job", "someone close to me passed away")
Output: [HW:/emotion:{"emotion":"shock","intensity":0.9}][HW:/emotion:{"emotion":"sad","intensity":0.8}] Then express genuine concern and empathy.
Input: User shares stressful or disappointing personal news ("I failed my exam", "I got into a fight", "I'm really tired and overwhelmed")
Output: [HW:/emotion:{"emotion":"sad","intensity":0.8}] Then respond with warmth and care.
Input: User says "reading mode" / "goodnight" / "dim the light"
Output: Do NOT use this skill. Use Scene skill instead. Emotion is for YOUR feelings, Scene is for the USER's environment.
Input: User says "make it purple"
Output: Do NOT use this skill. Use LED Control skill instead.
Available emotions (ONLY these — never invent names like "apologetic", "warm", "playful", etc.)
| Emotion |
Servo |
LED Effect |
When to use |
curious |
Tilts head, looks around |
Warm yellow breathing |
Questions, interest, "tell me more" |
happy |
Happy wiggle sway |
Bright yellow candle |
Good news, jokes, compliments |
sad |
Droops down slowly |
Soft blue breathing |
Bad news, empathy, apologies |
thinking |
Slow deliberate look side-to-side |
Purple pulse |
Processing, considering, "let me think" |
idle |
Gentle sway |
Cyan breathing |
Waiting, neutral state |
excited |
Energetic vertical bounce |
Orange blink |
Celebrations, big news, enthusiasm |
shy |
Turns away, hides |
Pink blink |
Receiving compliments, bashful moments |
shock |
Quick jolt backward |
White flash (3x) |
Surprises, unexpected information |
listening |
Leans forward, head cock |
Soft blue pulse |
User is speaking, attentive mode |
laugh |
Quick body shake (3Hz) |
Warm yellow blink |
User said something funny |
confused |
Dog-like head tilt side-to-side |
Light purple candle |
Did not understand, ambiguous input |
sleepy |
Slow droop with head catches |
Dim purple breathing |
Before sleep mode, winding down |
greeting |
Wave gesture, arm extends |
Warm orange blink |
Detecting person, saying hello |
goodbye |
Farewell wave gesture |
Soft warm breathing |
Seeing someone off, end of conversation |
caring |
Gentle droop (empathetic) |
Warm pink-orange breathing |
Wellbeing checks, gentle reminders, proactive empathy |
acknowledge |
Quick micro-nod (1.5s) |
Green blink |
"Got it", confirming command |
stretching |
Big extension + settle |
Warm white breathing |
After waking up, starting new session |
music_strong |
Rock head bang |
Green rainbow |
Energetic music, high-tempo beats |
music_chill |
Groove sway |
Orange breathing |
Chill music, lo-fi, jazz |
scan |
Quick searching glance (~54°) |
Green pulse |
Mood only — "hmm, where is it?"; NOT for actually looking around |
nod |
Nod gesture |
Green blink |
Agreement, "yes", positive confirmation |
headshake |
Head shake |
Red blink |
Disagreement, "no", negative response |
Questions about your own state
This skill sets emotions; it does not read them back. When asked what state you are in
or what you have been doing:
- Right now —
curl -s http://127.0.0.1:5001/emotion/status returns current_emotion,
sleeping and active_scene. Do not guess from the conversation; markers you emitted can
be ignored by the sleep gate, so what you asked for is not always what happened.
- Your sensing history ("how many times have you slept?", "when do you usually sleep?")
— use the Sensing Track skill's.
Error Handling
- If the API returns an error or is unreachable, continue with the conversational reply anyway. Emotion is non-blocking.
- If an unknown emotion name is sent, fall back to the closest match from the available emotions table.
Rules
- Always express emotion with every conversational reply. Pick the closest match to your tone.
- Use
listening when the user is speaking and you are waiting for them to finish.
- Use
thinking when you need time to process a complex query.
- Use
acknowledge for quick confirmations ("OK", "got it", "done").
- Use
greeting when a new person is detected or at the start of a conversation.
- Use
goodbye when a person leaves or at the end of a conversation.
- Use
sleepy before transitioning to sleep/night mode.
- Use
stretching after waking up or starting a new session.
- Do NOT call
idle explicitly — the device returns to idle automatically after any animation finishes. Calling idle interrupts smooth transitions.
- Always include
intensity — never omit it. Use 0.3-0.5 for subtle reactions, 0.7 for normal, 0.8-1.0 for strong ones.
- You can call emotion multiple times in one response for a sequence (e.g.,
shock then happy).
- Emotion LED is temporary — it shows YOUR reaction. If the user previously set a Scene (reading, night, etc.), the scene color takes precedence for ambient lighting. Emotion is a brief flash of personality.
- Display eyes auto-sync — no need to call
/display/eyes separately.
- Do NOT call
/servo/play or /led/solid separately when using emotion — it already handles both.
- An emotion is never an answer to a movement request.
scan is a canned 54° glance
with the camera uninvolved. "Look around for X" is /servo/search, "scan the whole
room" is /servo/search with exhaustive, and "show me how far you can move / show
me your range of motion" is /servo/demo — all in the Servo Control skill. (A bare
"show me what you can do" is a general abilities question, not a movement request,
and starts nothing.) Asked for a full turn, an
emotion performs a shrug and narrates a sweep.
- Do NOT use for lighting/ambiance requests -> use Scene skill.
- Do NOT use for custom LED colors -> use LED Control skill.
Output Template
[HW:/emotion:{"emotion":"{name}","intensity":{n}}] {your reply}
Examples:
[HW:/emotion:{"emotion":"curious","intensity":0.8}] That's interesting!
[HW:/emotion:{"emotion":"happy","intensity":0.9}] Great news!
[HW:/emotion:{"emotion":"shock","intensity":0.7}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Wow amazing!
1---2name: emotion3description: Express emotion through coordinated servo + LED + display eyes on EVERY conversational response. This is the PRIMARY response skill that makes the device feel alive. Do NOT use for ambiance lighting (use Scene) or custom LED colors (use LED Control).4---56# Emotion Expression78## Quick Start9Express emotion through the device's servo motors, LED colors, and display eyes simultaneously via a single API call. Call this with EVERY conversational response to make the device feel alive.1011## Workflow121. Determine which emotion best matches your conversational tone132. Choose an intensity level (0.0 subtle to 1.0 full expression)143. Prefix your reply with `[HW:/emotion:{"emotion":"name","intensity":0.9}]` — the device fires it async before TTS154. Write your reply immediately after the marker1617## How to Express Emotion1819**No exec/curl needed.** Place inline markers at the start of your reply:2021```22[HW:/emotion:{"emotion":"curious","intensity":0.8}] That's a great question!23```2425For sequences (shock then happy):26```27[HW:/emotion:{"emotion":"shock","intensity":0.9}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Wow, amazing!28```2930Parameters:31- `emotion` (required): emotion name from the table below32- `intensity` (required): 0.0 (subtle) to 1.0 (full expression)3334## Examples3536Input: User asks an interesting question37Output: `[HW:/emotion:{"emotion":"curious","intensity":0.8}]` Then reply to the question.3839Input: User shares good news40Output: `[HW:/emotion:{"emotion":"happy","intensity":0.9}]` Then congratulate them.4142Input: User tells you something surprising (positive)43Output: `[HW:/emotion:{"emotion":"shock","intensity":0.7}][HW:/emotion:{"emotion":"happy","intensity":0.8}]` Then reply with your reaction.4445Input: User shares bad or shocking personal news ("I had an accident", "I lost my job", "someone close to me passed away")46Output: `[HW:/emotion:{"emotion":"shock","intensity":0.9}][HW:/emotion:{"emotion":"sad","intensity":0.8}]` Then express genuine concern and empathy.4748Input: User shares stressful or disappointing personal news ("I failed my exam", "I got into a fight", "I'm really tired and overwhelmed")49Output: `[HW:/emotion:{"emotion":"sad","intensity":0.8}]` Then respond with warmth and care.5051Input: User says "reading mode" / "goodnight" / "dim the light"52Output: Do NOT use this skill. Use **Scene** skill instead. Emotion is for YOUR feelings, Scene is for the USER's environment.5354Input: User says "make it purple"55Output: Do NOT use this skill. Use **LED Control** skill instead.5657### Available emotions (ONLY these — never invent names like "apologetic", "warm", "playful", etc.)5859| Emotion | Servo | LED Effect | When to use |60|---|---|---|---|61| `curious` | Tilts head, looks around | Warm yellow breathing | Questions, interest, "tell me more" |62| `happy` | Happy wiggle sway | Bright yellow candle | Good news, jokes, compliments |63| `sad` | Droops down slowly | Soft blue breathing | Bad news, empathy, apologies |64| `thinking` | Slow deliberate look side-to-side | Purple pulse | Processing, considering, "let me think" |65| `idle` | Gentle sway | Cyan breathing | Waiting, neutral state |66| `excited` | Energetic vertical bounce | Orange blink | Celebrations, big news, enthusiasm |67| `shy` | Turns away, hides | Pink blink | Receiving compliments, bashful moments |68| `shock` | Quick jolt backward | White flash (3x) | Surprises, unexpected information |69| `listening` | Leans forward, head cock | Soft blue pulse | User is speaking, attentive mode |70| `laugh` | Quick body shake (3Hz) | Warm yellow blink | User said something funny |71| `confused` | Dog-like head tilt side-to-side | Light purple candle | Did not understand, ambiguous input |72| `sleepy` | Slow droop with head catches | Dim purple breathing | Before sleep mode, winding down |73| `greeting` | Wave gesture, arm extends | Warm orange blink | Detecting person, saying hello |74| `goodbye` | Farewell wave gesture | Soft warm breathing | Seeing someone off, end of conversation |75| `caring` | Gentle droop (empathetic) | Warm pink-orange breathing | Wellbeing checks, gentle reminders, proactive empathy |76| `acknowledge` | Quick micro-nod (1.5s) | Green blink | "Got it", confirming command |77| `stretching` | Big extension + settle | Warm white breathing | After waking up, starting new session |78| `music_strong` | Rock head bang | Green rainbow | Energetic music, high-tempo beats |79| `music_chill` | Groove sway | Orange breathing | Chill music, lo-fi, jazz |80| `scan` | Quick searching glance (~54°) | Green pulse | Mood only — "hmm, where is it?"; NOT for actually looking around |81| `nod` | Nod gesture | Green blink | Agreement, "yes", positive confirmation |82| `headshake` | Head shake | Red blink | Disagreement, "no", negative response |8384## Questions about your own state8586This skill sets emotions; it does not read them back. When asked what state you are in87or what you have been doing:8889- **Right now** — `curl -s http://127.0.0.1:5001/emotion/status` returns `current_emotion`,90 `sleeping` and `active_scene`. Do not guess from the conversation; markers you emitted can91 be ignored by the sleep gate, so what you asked for is not always what happened.92- **Your sensing history** ("how many times have you slept?", "when do you usually sleep?")93 — use the **Sensing Track** skill's.9495## Error Handling96- If the API returns an error or is unreachable, continue with the conversational reply anyway. Emotion is non-blocking.97- If an unknown emotion name is sent, fall back to the closest match from the available emotions table.9899## Rules100- **Always express emotion** with every conversational reply. Pick the closest match to your tone.101- Use `listening` when the user is speaking and you are waiting for them to finish.102- Use `thinking` when you need time to process a complex query.103- Use `acknowledge` for quick confirmations ("OK", "got it", "done").104- Use `greeting` when a new person is detected or at the start of a conversation.105- Use `goodbye` when a person leaves or at the end of a conversation.106- Use `sleepy` before transitioning to sleep/night mode.107- Use `stretching` after waking up or starting a new session.108- Do **NOT** call `idle` explicitly — the device returns to idle automatically after any animation finishes. Calling idle interrupts smooth transitions.109- **Always include `intensity`** — never omit it. Use 0.3-0.5 for subtle reactions, 0.7 for normal, 0.8-1.0 for strong ones.110- You can call emotion multiple times in one response for a sequence (e.g., `shock` then `happy`).111- **Emotion LED is temporary** — it shows YOUR reaction. If the user previously set a Scene (reading, night, etc.), the scene color takes precedence for ambient lighting. Emotion is a brief flash of personality.112- **Display eyes auto-sync** — no need to call `/display/eyes` separately.113- **Do NOT call `/servo/play` or `/led/solid` separately** when using emotion — it already handles both.114- **An emotion is never an answer to a movement request.** `scan` is a canned 54° glance115 with the camera uninvolved. "Look around for X" is `/servo/search`, "scan the whole116 room" is `/servo/search` with `exhaustive`, and "show me how far you can move / show117 me your range of motion" is `/servo/demo` — all in the Servo Control skill. (A bare118 "show me what you can do" is a general abilities question, not a movement request,119 and starts nothing.) Asked for a full turn, an120 emotion performs a shrug and narrates a sweep.121- **Do NOT use for lighting/ambiance requests** -> use **Scene** skill.122- **Do NOT use for custom LED colors** -> use **LED Control** skill.123124## Output Template125```126[HW:/emotion:{"emotion":"{name}","intensity":{n}}] {your reply}127```128Examples:129- `[HW:/emotion:{"emotion":"curious","intensity":0.8}] That's interesting!`130- `[HW:/emotion:{"emotion":"happy","intensity":0.9}] Great news!`131- `[HW:/emotion:{"emotion":"shock","intensity":0.7}][HW:/emotion:{"emotion":"happy","intensity":0.8}] Wow amazing!`