๐ Calendar Voice Reminders
In the busy workday, itโs easy to forget upcoming meetings. Let Rose monitor your calendar and remind you with voice notifications at important momentsโlike having a thoughtful assistant by your side.
Scenario Description
Use Cases
| Scenario | Reminder Timing | Reminder Method |
|---|---|---|
| ๐ Client Meetings | 15 minutes before | Voice + Text |
| ๐ฅ Team Meetings | 10 minutes before | Voice reminder |
| ๐ฏ Important Deadlines | 1 day before | Voice + detailed info |
| โ๏ธ Travel Itineraries | 2 hours before departure | Voice + weather info |
| ๐ Regular Reminders | Daily at fixed times | Brief voice message |
Expected Results
- ๐ Never Miss Meetings: Early reminders give you time to prepare
- ๐๏ธ Voice is More Noticeable: Harder to ignore than text notifications
- ๐ฑ Receive While on the Move: Voice plays on your phone, works even while driving
- โฐ Multi-Tier Reminders: Layered reminders at 1 day, 1 hour, and 15 minutes before
Calendar Connection
Supported Calendar Sources
| Source | Connection Method | Setup Difficulty |
|---|---|---|
| Google Calendar | Google API | โญโญ |
| Microsoft Outlook | Microsoft Graph API | โญโญ |
| CalDAV | Universal protocol | โญโญโญ |
| Local calendar files | Read .ics files | โญ |
Google Calendar Connection Setup
{`1. Go to Google Cloud Console
https://console.cloud.google.com/
2. Create a new project or select an existing one
3. Enable Google Calendar API
- Go to "APIs & Services" โ "Library"
- Search for "Google Calendar API"
- Click "Enable"
4. Create credentials
- Go to "APIs & Services" โ "Credentials"
- Click "Create Credentials" โ "OAuth 2.0 Client ID"
- Application type: "Desktop App"
- Download the JSON credentials file
5. Save credentials file to:
~/.config/realvco/google-credentials.json`}
Calendar Sync Script
{`// Calendar sync script
const { google } = require('googleapis');
const fs = require('fs');
async function getUpcomingEvents() {
// Load credentials
const credentials = JSON.parse(
fs.readFileSync(process.env.GOOGLE_CREDENTIALS_PATH)
);
// Create OAuth2 client
const { client_secret, client_id, redirect_uris } = credentials.installed;
const oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]
);
// Set tokens (must run authorization flow first to obtain)
oAuth2Client.setCredentials({
access_token: process.env.GOOGLE_ACCESS_TOKEN,
refresh_token: process.env.GOOGLE_REFRESH_TOKEN
});
// Call Calendar API
const calendar = google.calendar({ version: 'v3', auth: oAuth2Client });
const now = new Date();
const tomorrow = new Date(now);
tomorrow.setDate(tomorrow.getDate() + 1);
const response = await calendar.events.list({
calendarId: 'primary',
timeMin: now.toISOString(),
timeMax: tomorrow.toISOString(),
singleEvents: true,
orderBy: 'startTime'
});
return response.data.items;
}
module.exports = { getUpcomingEvents };`}
Voice Reminder Setup
Voice Reminder Flow
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โ Check Calendarโ โ โ Determine โ โ โ Generate โ
โ โ โ Reminder Timeโ โ Voice Contentโ
โโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโค โโโโโโโโโโโโโโโโค
โ Every 5 min โ โ โข 15 min โ โ โข Event name โ
โ Read events โ โ โข 1 hour โ โ โข Start time โ
โ โ โ โข 1 day โ โ โข Location โ
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ โโโโโโโโฌโโโโโโโโ
โ
โผ
โโโโโโโโโโโโโโโโ
โ Send โ
โ Reminder โ
โโโโโโโโโโโโโโโโค
โ โข Text msg โ
โ โข Voice msg โ
โ โข Push notif โ
โโโโโโโโโโโโโโโโ
Voice Content Templates
{`# 15 minutes before meeting
โฐ Meeting starting soon!
"Boss, your meeting starts in 15 minutes.
Event: {meeting_title}
Time: {start_time}
Location: {location}
Ready?"
---
# 1 hour before meeting
๐
Meeting Reminder
"Boss, you have a meeting in 1 hour.
{meeting_title}, starting at {start_time}.
{description}
Don't forget to prepare relevant materials!"
---
# Daily morning preview
๐ Today's Schedule
"Good morning, Boss! You have {count} events today:
{for each event}
- {time}: {title}
{/for}
Have a great day!"`}
Voice Sending Configuration
{`# Voice reminder settings
tts:
provider: elevenlabs # or google, azure
voice_id: nova # Voice selection
language: zh-TW # Traditional Chinese
reminders:
- name: meeting_15min
trigger: "event.start - 15 minutes"
message_template: "meeting_15min"
channels:
- telegram_voice
- telegram_text
- name: meeting_1hour
trigger: "event.start - 1 hour"
message_template: "meeting_1hour"
channels:
- telegram_text
- name: daily_briefing
trigger: "08:00 daily"
message_template: "daily_morning"
channels:
- telegram_voice
- name: deadline_alert
trigger: "deadline - 1 day"
message_template: "deadline_reminder"
channels:
- telegram_voice
- telegram_text`}
Scheduling Configuration
Heartbeat Periodic Checks
{`// Heartbeat reminder check
const { getUpcomingEvents } = require('./calendar-sync');
const { sendVoiceMessage } = require('./telegram-bot');
const { generateTTS } = require('./tts-service');
async function checkReminders() {
const now = new Date();
const events = await getUpcomingEvents();
for (const event of events) {
const startTime = new Date(event.start.dateTime);
const diffMinutes = (startTime - now) / (1000 * 60);
// Check if 15-minute reminder should be sent
if (diffMinutes > 14 && diffMinutes < 15) {
await sendMeetingReminder(event, '15min');
}
// Check if 1-hour reminder should be sent
if (diffMinutes > 59 && diffMinutes < 60) {
await sendMeetingReminder(event, '1hour');
}
}
}
async function sendMeetingReminder(event, timing) {
const templates = {
'15min': `Boss, your meeting starts in 15 minutes. Event: ${event.summary}. Time: ${formatTime(event.start.dateTime)}.`,
'1hour': `Boss, you have a meeting in 1 hour. ${event.summary}, starting at ${formatTime(event.start.dateTime)}.`
};
const message = templates[timing];
// Generate voice
const voiceBuffer = await generateTTS(message);
// Send voice message
await sendVoiceMessage({
chat_id: process.env.ADMIN_CHAT_ID,
voice: voiceBuffer,
caption: message
});
console.log(`โ
Sent ${timing} reminder: ${event.summary}`);
}
// Check every 5 minutes
setInterval(checkReminders, 5 * 60 * 1000);
module.exports = { checkReminders };`}
Cron Scheduling
{`# Send today's schedule preview every morning at 8 AM
0 8 * * * cd /home/node/.openclaw/workspace && node scripts/daily-briefing.js
# Check upcoming meetings every 5 minutes
*/5 * * * * cd /home/node/.openclaw/workspace && node scripts/check-reminders.js
# Preview tomorrow's schedule every evening at 9 PM
0 21 * * * cd /home/node/.openclaw/workspace && node scripts/tomorrow-preview.js`}
Advanced Applications
Smart Reminder Upgrades
{`# Smart contextual reminders
## Travel Reminder
"Boss, you need to leave for the airport in 2 hours.
Flight: {flight_number}
Destination: {destination}
Local weather: {weather}
Don't forget your passport and charger!"
## Client Meeting Prep
"Boss, you have a meeting with {client_name} in 30 minutes.
Last conversation summary:
{last_conversation_summary}
Items to confirm:
{pending_items}
Related documents:
{relevant_documents}`}
Multi-Layer Reminder System
Important Meetings (marked as important):
โโโ 1 day before: Detailed prep reminder + related documents
โโโ 1 hour before: Departure reminder + traffic info
โโโ 15 minutes before: Immediate preparation reminder
โโโ 1 minute before: Final confirmation
Regular Meetings:
โโโ 15 minutes before: Standard reminder
Deadlines:
โโโ 3 days before: Early preparation reminder
โโโ 1 day before: Deadline tomorrow reminder
โโโ Morning of: Today deadline reminder
Integration with Other Systems
{`# Integrate with weather API
When meeting location is in another city, automatically append:
"It's raining in Taipei tomorrow, remember to bring an umbrella!"
# Integrate with traffic API
When meeting location differs, remind:
"Estimated travel time is 30 minutes, recommend leaving at 2:30"
# Integrate with CRM
Before client meetings, automatically remind:
"This is the third meeting with XX Company,
last time discussed {previous_topic},
main goal this time is {meeting_goal}`}
FAQ
Q: What if the voice reminder is unclear?
- Choose a clearer voice model
- Adjust speech rate (recommend 0.9-1.1x)
- Send text version as backup simultaneously
- Test in different environments (quiet/noisy)
Q: Can reminder times be adjusted?
Yes! Modify the config file:
reminders:
- trigger: "event.start - 30 minutes" # Change to 30 minutes before
Q: How to pause a specific reminder?
Add tags to calendar events:
#no-reminder: No reminders at all#silent: Text only, no voice
Q: Which voice platforms are supported?
Currently supported:
- ElevenLabs (best quality)
- Google Cloud Text-to-Speech
- Azure Cognitive Services
- System built-in TTS (free but lower quality)
Summary
๐ Calendar Voice Reminders ensure you never miss an important moment:
- Calendar Connection: Google/Outlook automatic sync
- Multi-Tier Reminders: Reminders at 1 day, 1 hour, and 15 minutes before
- Voice Notifications: More noticeable than text, works even while driving
- Smart Upgrades: Combine weather, traffic, and CRM for complete information