hotel_pi/README.md
2026-04-06 21:33:52 -04:00

239 lines
7.2 KiB
Markdown

# Hotel Pi - Raspberry Pi TV Kiosk System
A production-grade, hotel-style TV kiosk application built with SvelteKit, Node.js, and Directus CMS.
## Overview
Hotel Pi provides a fullscreen, remote-controlled kiosk interface for Raspberry Pi 4/5, designed to mimic modern hotel TV systems with:
- **Idle Screen**: Time, date, and welcome message with ambient visuals
- **Home Menu**: Gridded navigation to main features
- **Dynamic Content**: Restaurants and attractions from Directus CMS
- **Media Integration**: Seamless Plex/Kodi launch support
- **Remote Control**: HDMI-CEC input handling via Node.js service
- **WebSocket Communication**: Real-time event delivery between control service and frontend
## Architecture
```
┌─────────────────────────────────────────────────────┐
│ Chromium Kiosk (fullscreen) │
│ SvelteKit Frontend (localhost:5173) │
└───────────────────┬─────────────────────────────────┘
│ WebSocket
┌───────────────────▼─────────────────────────────────┐
│ Node.js Control Service (localhost:3001) │
│ - HDMI-CEC listener (cec-client) │
│ - System command executor │
│ - WebSocket event emitter │
└───────────────────┬─────────────────────────────────┘
┌───────────┴────────────┬──────────────┐
│ │ │
┌───────▼──────────┐ ┌──────────▼────────┐ │
│ Directus CMS │ │ PostgreSQL DB │ │
│ REST API │ │ │ │
└──────────────────┘ └───────────────────┘ │
┌───────────▼─────────┐
│ System Services │
│ - Plex │
│ - Kodi │
│ - Chromium │
└─────────────────────┘
```
## Quick Start
### Prerequisites
- Node.js 18+
- Docker & Docker Compose
- Raspberry Pi 4 or 5 (or Linux/macOS for development)
### Setup
1. **Clone and install dependencies:**
```bash
git clone <repo>
cd Hotel_Pi
cp .env.example .env
```
2. **Start services with Docker Compose:**
```bash
docker-compose up -d
```
3. **Run frontend (development):**
```bash
cd frontend
npm install
npm run dev
```
4. **Run control service (in separate terminal):**
```bash
cd control-service
npm install
npm run dev
```
5. **Access the system:**
- Frontend: http://localhost:5173
- Directus: http://localhost:8055
- Control Service: ws://localhost:3001
## Directory Structure
```
Hotel_Pi/
├── frontend/ # SvelteKit application
│ ├── src/
│ │ ├── routes/ # Page components
│ │ ├── lib/ # Shared utilities
│ │ ├── components/ # Reusable UI components
│ │ └── app.svelte # Root layout
│ ├── svelte.config.js
│ └── package.json
├── control-service/ # Node.js control service
│ ├── src/
│ │ ├── server.js # Main entry point
│ │ ├── cec-handler.js # HDMI-CEC listener
│ │ └── commands.js # System command executor
│ └── package.json
├── directus/ # CMS configuration
│ ├── extensions/
│ └── snapshots/
├── docker/ # Docker Compose files
│ └── docker-compose.yml
├── scripts/ # Launch and control scripts
│ ├── launch-kiosk.sh
│ ├── launch-plex.sh
│ └── return-to-kiosk.sh
└── docker-compose.yml # Main orchestration
```
## Configuration
See [.env.example](.env.example) for all available configuration options.
Key settings:
- `VITE_API_URL`: Directus API endpoint
- `VITE_WS_URL`: Control service WebSocket endpoint
- `CEC_DEVICE`: Serial device for HDMI-CEC (typically `/dev/ttyAMA0`)
- `IDLE_TIMEOUT_MINUTES`: Auto-return to idle screen after this duration
## Development
### Frontend Development
```bash
cd frontend
npm run dev
```
Hot-reload enabled. Access at http://localhost:5173
### Control Service Development
```bash
cd control-service
npm run dev
```
WebSocket server available at ws://localhost:3001
### CMS Setup
Directus runs at http://localhost:8055
Default credentials (change in production):
- Email: admin@example.com
- Password: (set during first run)
## Deployment (Raspberry Pi)
1. **Install system dependencies:**
```bash
sudo apt-get update
sudo apt-get install -y docker.io docker-compose chromium-browser libcec-dev
```
2. **Build production bundle:**
```bash
cd frontend
npm run build
```
3. **Deploy with Docker Compose:**
```bash
docker-compose -f docker/docker-compose.yml up -d
```
4. **Launch kiosk (runs on startup):**
```bash
./scripts/launch-kiosk.sh
```
## Input Handling
### HDMI-CEC Remote Events
- **Arrow Keys**: Navigate menu
- **Select/OK**: Choose item
- **Back**: Return to previous screen
- **Any key**: Wake from idle screen
Control service translates CEC codes and emits WebSocket events.
## Performance Optimization
- CSS animations preferred over JavaScript
- Lazy loading for images
- Optimized SVG assets
- Minimal JavaScript dependencies
- Service worker caching
## Production Considerations
- [ ] Change all default credentials
- [ ] Set up HTTPS for Directus (if public)
- [ ] Configure CORS properly
- [ ] Set environment-specific secrets
- [ ] Enable log rotation
- [ ] Set up health checks
- [ ] Configure automatic restarts
## Troubleshooting
### HDMI-CEC not working
- Check device: `ls -la /dev/ttyAMA0`
- Test with `cec-client` command directly
- Verify CEC is enabled on TV
### WebSocket connection fails
- Check firewall rules
- Ensure control service is running: `curl http://localhost:3001/health`
- Review browser console for connection errors
### Frontend not loading
- Check Docker logs: `docker logs hotel_pi_frontend`
- Verify API URL in `.env`
- Clear browser cache
## Contributing
1. Create a feature branch
2. Make changes following the code style
3. Test on Raspberry Pi if possible
4. Submit a pull request
## License
MIT
## Support
For issues and questions, please open an issue on GitHub.