A "good morning" voice ability for OpenHome that delivers a concise 30-second morning summary combining real-time weather, an inspirational quote, and a fun fact — all woven into a natural-sounding conversational briefing by the LLM.
When triggered, the ability:
- Fetches current weather from Open-Meteo (free, no API key)
- Fetches a daily quote from ZenQuotes (free, no API key)
- Fetches a random fun fact from Useless Facts API (free, no API key)
- Passes all three data points to the LLM, which weaves them into a natural 3-sentence morning briefing
- Speaks the briefing aloud
After the briefing, users can:
- Ask for more details on the weather, quote, or fun fact
- Change the city for a different weather location
- Hear the briefing again
- Say "done" to exit
- "Good morning"
- "Morning briefing"
- "Daily briefing"
- "Start my day"
- "Morning update"
- "Give me my briefing"
User: "Good morning"
Speaker: "One moment, getting your morning update."
Speaker: "Good morning! It's 45 degrees and partly cloudy in New York — layer up if you're heading out. Here's some wisdom from Mark Twain: 'The secret of getting ahead is getting started.' And fun fact — the first email was sent in 1971!"
Speaker: "Want details on weather, quote, or fact? Or say done."
User: "Tell me more about the weather"
Speaker: "It's 45 degrees Fahrenheit with partly cloudy skies. Might want a jacket today!"
User: "Change city to Austin"
Speaker: "Which city would you like the briefing for?"
User: "Austin"
Speaker: (delivers new briefing for Austin)
User: "Done"
Speaker: "Have a great day!"
No API keys required. All three APIs used are completely free and keyless:
| API | Purpose | URL |
|---|---|---|
| Open-Meteo | Weather | api.open-meteo.com |
| ZenQuotes | Daily quote | zenquotes.io |
| Useless Facts | Fun fact | uselessfacts.jsph.pl |
Default location is New York. Users can change the city by voice during the session.
| SDK Method | Purpose |
|---|---|
speak() |
Deliver the briefing and responses to the user |
run_io_loop() |
Ask follow-up prompts and listen for user replies |
text_to_text_response() |
LLM weaves raw API data into a conversational briefing; also used for city name extraction fallback |
user_response() |
Capture user input for city changes |
resume_normal_flow() |
Hand control back to the Agent when done |
editor_logging_handler |
Log API errors without using print() |
- Keyword-first detection for commands (weather/quote/fact/exit/location) — no LLM round-trip for simple intents
- LLM fallback for city name extraction when keyword match fails
- Graceful degradation — if any API fails, the briefing still delivers with available data
- Interaction loop with max 10 turns to prevent runaway sessions
- All exit paths call
resume_normal_flow()