A comprehensive React Native Expo application for controlling and scheduling Yoto players via MQTT. This app transforms your mobile device into a powerful remote control and scheduler for your Yoto players, providing seamless audio card management and playback automation.
๐ NEW: Your schedules now work even when the app is closed! The latest version includes:
- Background task execution - schedules run automatically in the background
- Smart notifications - get alerts when schedules activate
- Background status monitoring - check your device's background capabilities
- Improved reliability - multiple fallback mechanisms for schedule execution
**๐ฑ For full background scheduling capabilities, use the development build instructions below!**oto Scheduler ๐ต
A comprehensive React Native Expo application for controlling and scheduling Yoto players via MQTT. This app transforms your mobile device into a powerful remote control and scheduler for your Yoto players, providing seamless audio card management a### Scheduling Audio Cards
- Open Scheduler: Tap the "๐ Card Scheduler" tab
- Add Schedule: Tap "+" to create a new scheduled playback
- Select Card: Choose which audio card to play
- Set Time: Pick the time for automatic playback
- Save: Your schedule runs automatically even when the app is closed
- Check Status: Tap "๐ Background Status" to view background capabilities
- Enable Notifications: Allow notifications for schedule alerts
- Background Refresh: Ensure Background App Refresh is enabled in iOS Settings
- Reliability: For best results, keep the app recently used or open near scheduled timesyback automation.
Step 1: Install Expo Go on Your Device
- ๐ฑ iOS: Download from App Store
- ๐ค Android: Download from Google Play
Step 2: Launch the App Instantly
Option A: Direct Development Link (Recommended)
- ๐ฒ Tap this link on your mobile device:
https://expo.dev/preview/update?message=Add+background+scheduling+support+-+schedules+now+work+when+app+is+closed&updateRuntimeVersion=1.0.0&createdAt=2025-09-03T05%3A05%3A55.816Z&slug=exp&projectId=7a24c41c-1c8a-4c69-807c-10668ac7aa83&group=4bd5d84c-691b-4654-9680-a642efbf6e88 - ๐ Auto-opens in Expo Go - No QR scanning needed!
Option B: QR Code Method (Alternative)
- ๐ Open the development link above on a desktop browser
- ๐ฑ Scan the QR code displayed on the page with camera
Step 3: Start Using the App
- โ App loads automatically in Expo Go
- ๐ Login with your Yoto account credentials
- ๐ฎ Select your Yoto player from discovered devices
- ๐ต Start controlling your Yoto player remotely!
- Install Expo Go: Search "Expo Go" in App Store and install
- Open the link: Tap
https://expo.dev/preview/update?message=Add+background+scheduling+support+-+schedules+now+work+when+app+is+closed&updateRuntimeVersion=1.0.0&createdAt=2025-09-03T05%3A05%3A55.816Z&slug=exp&projectId=7a24c41c-1c8a-4c69-807c-10668ac7aa83&group=4bd5d84c-691b-4654-9680-a642efbf6e88on your iPhone - Allow app opening: iOS will ask "Open in Expo Go?" - tap "Open"
- Wait for loading: App downloads and launches automatically
- Login and enjoy: Use your Yoto credentials to start controlling
- Install Expo Go: Search "Expo Go" in Google Play Store and install
- Open the link: Tap
https://expo.dev/preview/update?message=Add+background+scheduling+support+-+schedules+now+work+when+app+is+closed&updateRuntimeVersion=1.0.0&createdAt=2025-09-03T05%3A05%3A55.816Z&slug=exp&projectId=7a24c41c-1c8a-4c69-807c-10668ac7aa83&group=4bd5d84c-691b-4654-9680-a642efbf6e88on your Android device - Choose app: Android will ask which app to open with - select "Expo Go"
- Wait for loading: App downloads and launches automatically
- Login and enjoy: Use your Yoto credentials to start controlling
If you prefer QR codes:
# Clone and run locally
git clone https://github.com/gandhiv88/Yoto-Scheduler.git
cd yoto_app_scheduler_js
npm install
npx expo start --tunnel
# Scan QR with Expo Go cameraโจ No installation, no build process - just instant access to test the app!
๐ข For existing users: If you've used the app before, simply open it again in Expo Go and it will automatically update to the latest version with background scheduling support!
Yoto Scheduler bridges the gap between your Yoto players and modern scheduling needs. Instead of manually inserting cards and managing playback, this app provides:
- Remote Control - Control your Yoto players from anywhere in your home
- Smart Scheduling - Schedule audio cards to play at specific times automatically
- Real-time Feedback - See battery status, connection health, and playback state
- Ambient Light Control - Control the RGB ambient lights on your Yoto players
- Multiple Player Support - Manage multiple Yoto players from one app
- Offline-First Design - Works even when internet connectivity is intermittent
- OAuth 2.0 integration with Yoto's official authentication system
- Secure token storage using Expo SecureStore
- Automatic token refresh and session management
- Real-time MQTT communication with AWS IoT infrastructure
- Play, pause, resume, and stop audio card playback
- Volume control and ambient light management
- Battery monitoring and connection diagnostics
- Schedule audio cards to play at specific times
- Background execution - schedules work even when app is closed
- Persistent scheduling that survives app restarts
- Smart notifications for schedule activation
- Visual schedule management with easy editing
- Background task monitoring and status
- Live connection status updates
- Battery level monitoring with charging status
- Connection health checks and automatic reconnection
- Detailed logging for troubleshooting
- Full RGB color control for Yoto player ambient lights
- Brightness adjustment with color temperature
- Pre-set color schemes and custom color picker
- Night light mode for bedtime routinesler
A React Native Expo application for controlling and scheduling Yoto players via MQTT. This app provides direct control over Yoto devices and allows you to schedule audio card playback, eliminating the need to switch between multiple applications.
- OAuth Authentication - Secure login with Yoto's authentication system
- Device Discovery - Automatically finds and connects to available Yoto players
- MQTT Control - Real-time communication with Yoto devices for instant response
- Card Management - Browse and select from your available audio cards
- Playback Control - Play, pause, and stop functionality
- Smart Scheduling - Schedule audio card playback at specific times
- Connection Monitoring - Real-time connection status and error handling
- React Native with Expo SDK 53 - Cross-platform mobile development framework
- MQTT over WebSocket - Real-time bidirectional communication with AWS IoT
- TypeScript - Type safety and enhanced developer experience
- Expo SecureStore - Encrypted storage for authentication tokens
- OAuth 2.0 with PKCE - Secure authentication flow
- AsyncStorage - Persistent storage for app data and schedules
- React Hooks - Modern state management and lifecycle handling
The app uses a sophisticated MQTT implementation over secure WebSocket connection:
- Broker:
aqrphjqbp3u2z-ats.iot.eu-west-2.amazonaws.com:443 - Protocol: WebSocket Secure (WSS) with MQTT v4
- Authentication: JWT-based AWS IoT custom authorizer
- Client ID Format:
SAMPLE{playerId}for compatibility - Topics: Device-specific command and status topics
- QoS: Quality of Service level 1 for reliable delivery
- Connection Management: Automatic reconnection with exponential backoff
src/
โโโ components/ # Reusable UI components
โ โโโ AmbientLightControl.tsx # RGB light control interface
โ โโโ BatteryStatus.js # Battery monitoring display
โ โโโ ErrorBoundary.tsx # Error handling wrapper
โ โโโ SchedulerScreen.js # Scheduling management UI
โ โโโ SnackBar.js # User notifications
โโโ services/ # Core business logic
โ โโโ mqttService.js # MQTT client and connection management
โ โโโ authService.js # OAuth authentication flow
โ โโโ apiService.js # Yoto API integration
โ โโโ simpleSchedulerService.js # Scheduling engine
โโโ config/ # Configuration management
โ โโโ env.js # Environment variables and settings
โโโ contexts/ # React context providers
โ โโโ SnackBarContext.tsx # Global notification system
โโโ hooks/ # Custom React hooks
โ โโโ usePlayerConnection.js # MQTT connection management
โ โโโ useScheduler.js # Scheduling logic
โโโ types/ # TypeScript type definitions
โ โโโ index.ts # App-wide type definitions
โโโ utils/ # Utility functions
โโโ tokenUtils.js # Token management helpers
Before you begin, ensure you have the following installed:
- Node.js (v18 or newer) - Download here
- npm or yarn - Package manager
- Expo CLI -
npm install -g @expo/cli - Git - For version control
-
Clone the Repository:
git clone https://github.com/gandhiv88/Yoto-Scheduler.git cd yoto_app_scheduler_js -
Install Dependencies:
npm install
-
Configure Environment (Optional): Create a
.envfile for custom configuration:YOTO_CLIENT_ID=your_custom_client_id YOTO_REDIRECT_URI=your_custom_redirect_uri LOG_LEVEL=debug
-
Start Development Server:
npx expo start
- Install Expo Go from the App Store
- Run
npx expo startin your terminal - Scan the QR code with your iPhone camera or Expo Go app
- The app will load directly on your device
- Install Xcode from the Mac App Store
- Run
npx expo start - Press
ito open in iOS Simulator - Select your preferred iPhone model
- Install EAS CLI:
npm install -g eas-cli - Configure EAS:
eas build:configure - Build for iOS:
eas build --platform ios - Install the
.ipafile via TestFlight or direct installation
- Install Expo Go from Google Play Store
- Run
npx expo startin your terminal - Scan the QR code with the Expo Go app
- The app will load directly on your device
- Install Android Studio
- Set up an Android Virtual Device (AVD)
- Run
npx expo start - Press
ato open in Android Emulator
- Build APK:
eas build --platform android --profile preview - Download the
.apkfile - Enable "Install from Unknown Sources" on your Android device
- Install the APK directly
- Build AAB:
eas build --platform android - Upload to Google Play Console for distribution
- USB Debugging: Enable USB debugging on Android for faster development
- Metro Bundler: The development server runs on
http://localhost:8081 - Hot Reloading: Changes to code will automatically refresh the app
- Device Logs: Use
npx expo logsto view device logs in real-time
- Login: Tap "Login" to authenticate with your Yoto account
- Select Player: Choose your Yoto player from the discovered devices
- Grant Permissions: Allow the app to control your player
- Play a Card: Browse your library and tap any card to start playback
- Playback Control: Use play/pause/stop buttons for immediate control
- Ambient Lights: Adjust colors and brightness with the light control panel
- Battery Monitor: Check battery level and charging status in real-time
- Open Scheduler: Tap the "Schedule" tab
- Add Schedule: Tap "+" to create a new scheduled playback
- Select Card: Choose which audio card to play
- Set Time: Pick the time for automatic playback
- Save: Your schedule runs automatically even when the app is closed
- Multiple Players: Switch between different Yoto players
- Connection Diagnostics: Monitor MQTT connection health
- Error Recovery: Automatic reconnection and error handling
The app supports customization through environment variables:
// src/config/env.js
const ENV_CONFIG = {
YOTO_CLIENT_ID: 'your_client_id',
YOTO_REDIRECT_URI: 'your_redirect_uri',
MQTT_BROKER: 'aqrphjqbp3u2z-ats.iot.eu-west-2.amazonaws.com',
LOG_LEVEL: 'debug' // 'error', 'warn', 'info', 'debug'
};If you need custom OAuth settings, update app.config.js:
extra: {
yotoClientId: process.env.YOTO_CLIENT_ID || "default_client_id",
yotoRedirectUri: process.env.YOTO_REDIRECT_URI || "default_redirect_uri",
}- Ensure your Yoto player is online and connected to WiFi
- Check that you're on the same network as your player
- Try refreshing the player list
- Clear app data and login again
- Ensure you're using the correct Yoto account credentials
- Check internet connectivity
- Verify network connectivity
- Check firewall settings (port 443 must be open)
- Ensure WebSocket connections are allowed
- Verify the app has background permissions
- Check that your device's clock is accurate
- Ensure the scheduled time is in the future
If the colors on your Yoto player don't match what you selected in the app:
- Use the Color Testing section in Ambient Light Control to test primary colors
- Check debug information - the app shows RGB values being sent to the device
- Try pure colors first - Red (#FF0000), Green (#00FF00), Blue (#0000FF)
- Brightness affects color accuracy - try 75-100% brightness for color testing
- BGR conversion - the app automatically handles Yoto's BGR color format
Technical Details:
- Yoto devices expect standard RGB color format
- The app sends colors directly as selected: RGB(255,0,0) for pure red
- Brightness scaling is applied before sending to device
- Example: Pure red at 50% brightness: RGB(255,0,0) โ RGB(128,0,0) sent to device
Enable debug logging by setting LOG_LEVEL: 'debug' in src/config/env.js for detailed console output.
This project addresses connectivity issues found in Flutter-based MQTT implementations for Yoto players. The JavaScript/React Native MQTT client provides superior reliability with Yoto's AWS IoT infrastructure.
- Stable MQTT Connection: Reliable WebSocket-based MQTT with proper error handling
- Battery Optimization: Efficient polling and connection management
- Cross-Platform Compatibility: Single codebase for iOS and Android
- Production-Ready: Error boundaries, proper logging, and graceful degradation
- OAuth 2.0 with PKCE for secure authentication
- Encrypted token storage using Expo SecureStore
- Environment-based configuration for sensitive data
- Proper certificate validation for MQTT connections
- ๐ฎ Advanced Scheduling: Recurring schedules, conditional triggers, and time zone support
- ๐ฅ Multi-User Support: Family accounts with individual preferences
- ๐ต Playlist Management: Create and manage custom audio card playlists
- ๐ฃ Voice Control: Integration with Siri/Google Assistant
- ๐ Usage Analytics: Playback history and usage statistics
- ๐ Sleep Timer: Automatic stop after specified duration
- ๐ Smart Notifications: Playback notifications and schedule reminders
- Offline Mode: Enhanced offline functionality with sync
- Performance: Optimized rendering and memory usage
- UI/UX: Material Design 3 and iOS design system compliance
- Testing: Comprehensive unit and integration test coverage
We welcome contributions from the community! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Make your changes and test thoroughly
- Commit your changes:
git commit -m 'Add amazing feature' - Push to the branch:
git push origin feature/amazing-feature - Open a Pull Request
- ๐จ UI/UX Improvements: Better designs and user experience
- ๐ Bug Fixes: Issue resolution and stability improvements
- ๐ Documentation: Code documentation and user guides
- ๐งช Testing: Unit tests, integration tests, and test automation
- โฟ Accessibility: Screen reader support and accessibility features
- ๐ Internationalization: Multi-language support
- Follow React Native best practices
- Maintain TypeScript type safety
- Write meaningful commit messages
- Update documentation for new features
- Test on both iOS and Android platforms
Gandhi Valliappan
- GitHub: @gandhiv88
- Project Repository: Yoto-Scheduler
- LinkedIn: Gandhi Valliappan
Gandhi is a passionate mobile developer specializing in React Native and cross-platform applications. This project was born from the need for a reliable Yoto player control solution that addresses real-world connectivity challenges faced by families using Yoto devices.
Expertise Areas:
- React Native & Expo Development
- MQTT & IoT Device Communication
- OAuth & Secure Authentication
- Cross-Platform Mobile Development
- AWS IoT & Cloud Integration
This project is licensed under the MIT License - see the LICENSE file for details.
This application is an unofficial third-party client for Yoto players. It is not affiliated with, endorsed by, or sponsored by Yoto.
- Educational Purpose: This project is primarily for educational and personal use
- API Usage: Please respect Yoto's terms of service and API usage guidelines
- No Warranty: The software is provided "as is" without warranty of any kind
- User Responsibility: Users are responsible for complying with all applicable terms of service
Yotoยฎ is a registered trademark of Yoto Ltd. This project uses the Yoto name and references for identification purposes only.
- Yoto Team: For creating amazing products that inspire creative solutions
- Expo Team: For the excellent React Native development platform
- MQTT.js Contributors: For the reliable MQTT client library
- React Native Community: For the extensive ecosystem and support
- Open Source Community: For the tools and libraries that make this project possible
Made with โค๏ธ for the Yoto community