Files
homeassistant-mcp/README.md
jango-blockchained ada5ea4646 Enhance project structure and testing capabilities
- Updated .dockerignore to include additional logs and IDE files, improving Docker build efficiency.
- Added .eslintrc.json for TypeScript linting configuration, ensuring code quality and consistency.
- Refactored Dockerfile to streamline the build process and utilize a slimmer Node.js image.
- Introduced jest-resolver.cjs and jest.setup.js for improved Jest testing configuration and setup.
- Updated jest.config.js to support ESM and added new test patterns for better test organization.
- Enhanced TypeScript schemas to include new device types (media_player, fan, lock, vacuum, scene, script, camera) for comprehensive validation.
- Added unit tests for device schemas and Home Assistant connection, improving test coverage and reliability.
- Updated README.md with new testing instructions and device control examples, enhancing user guidance.
2024-12-17 15:07:40 +01:00

262 lines
5.3 KiB
Markdown

# Model Context Protocol Server for Home Assistant
A powerful bridge between your Home Assistant instance and Language Learning Models (LLMs), enabling natural language control and monitoring of your smart home devices through the Model Context Protocol (MCP).
## Key Features
- **Smart Device Control** 🎮
- 💡 **Lights**: Brightness, color temperature, RGB color
- 🌡️ **Climate**: Temperature, HVAC modes, fan modes, humidity
- 🚪 **Covers**: Position and tilt control
- 🔌 **Switches**: On/off control
- 🚨 **Sensors & Contacts**: State monitoring
- **Intelligent Organization** 🏠
- Area and floor-based device grouping
- State monitoring and querying
- Smart context awareness
- **Robust Architecture** 🛠️
- Comprehensive error handling
- State validation
- Secure API integration
## Prerequisites
- Node.js 20.10.0 or higher
- NPM package manager
- Running Home Assistant instance
- Home Assistant long-lived access token ([How to get token](https://community.home-assistant.io/t/how-to-get-long-lived-access-token/162159))
## Installation
### Basic Setup
```bash
# Clone the repository
git clone https://github.com/jango-blockchained/homeassistant-mcp.git
cd homeassistant-mcp
# Install dependencies
npm install
# Build the project
npm run build
```
### Docker Setup (Recommended)
1. Clone and prepare:
```bash
git clone https://github.com/jango-blockchained/homeassistant-mcp.git
cd homeassistant-mcp
```
2. Configure environment:
```env
NODE_ENV=production
HASS_HOST=your_home_assistant_url
HASS_TOKEN=your_home_assistant_token
```
3. Launch with Docker Compose:
```bash
docker-compose up -d
```
## Configuration
Create a `.env` file with:
```env
HASS_TOKEN=your_home_assistant_token
HASS_HOST=your_home_assistant_url # e.g., http://homeassistant.local:8123
PORT=3000 # Optional, defaults to 3000
```
## Development
```bash
npm run dev # Development mode
npm run build # Build project
npm run start # Production mode
npx jest --config=jest.config.js # Run tests
```
## Supported Commands
### Common Entity Controls
```json
{
"tool": "control",
"command": "turn_on", // or "turn_off", "toggle"
"entity_id": "light.living_room"
}
```
### Light Control
```json
{
"tool": "control",
"command": "turn_on",
"entity_id": "light.living_room",
"brightness": 128,
"color_temp": 4000,
"rgb_color": [255, 0, 0]
}
```
### Climate Control
```json
{
"tool": "control",
"command": "set_temperature",
"entity_id": "climate.bedroom",
"temperature": 22,
"hvac_mode": "heat",
"fan_mode": "auto",
"humidity": 45
}
```
### Cover Control
```json
{
"tool": "control",
"command": "set_position",
"entity_id": "cover.living_room",
"position": 50,
"tilt_position": 45
}
```
### Media Player Control
```json
{
"tool": "control",
"command": "media_play", // or "media_pause", "media_stop", "media_next", "media_previous"
"entity_id": "media_player.living_room",
"volume_level": 0.5,
"source": "Spotify",
"media_content_id": "spotify:playlist:xyz",
"media_content_type": "playlist"
}
```
### Fan Control
```json
{
"tool": "control",
"command": "turn_on",
"entity_id": "fan.bedroom",
"percentage": 50,
"preset_mode": "auto",
"oscillating": true,
"direction": "forward"
}
```
### Lock Control
```json
{
"tool": "control",
"command": "lock", // or "unlock"
"entity_id": "lock.front_door"
}
```
### Vacuum Control
```json
{
"tool": "control",
"command": "start", // or "pause", "stop", "return_to_base", "clean_spot"
"entity_id": "vacuum.robot",
"fan_speed": "medium"
}
```
### Scene Control
```json
{
"tool": "control",
"command": "turn_on",
"entity_id": "scene.movie_night"
}
```
### Script Control
```json
{
"tool": "control",
"command": "turn_on",
"entity_id": "script.welcome_home",
"variables": {
"brightness": 100,
"color": "red"
}
}
```
### Camera Control
```json
{
"tool": "control",
"command": "enable_motion_detection", // or "disable_motion_detection"
"entity_id": "camera.front_door"
}
```
## Natural Language Integration
### Example Commands
- "Turn on the living room lights"
- "Set bedroom temperature to 22 degrees"
- "Is the front door locked?"
### Smart Features
- Context awareness across conversations
- Natural parameter interpretation
- Intelligent error prevention
- Multi-device orchestration
## Troubleshooting
### Common Issues
1. Node.js Version (`toSorted is not a function`)
- Solution: Update to Node.js 20.10.0+
2. Connection Issues
- Verify Home Assistant is running
- Check HASS_HOST accessibility
- Validate token permissions
3. Entity Control Issues
- Verify entity_id exists
- Check entity domain matches command
- Ensure parameter values are valid
## Project Status
**Complete**
- Entity, Floor, and Area access
- Device control (Lights, Climate, Covers, Switches, Contacts)
- Basic state management
- Error handling and validation
🚧 **In Progress**
- Custom prompt testing
- Resource context integration
- Tool organization optimization
## Contributing
1. Fork repository
2. Create feature branch
3. Submit pull request
## Resources
- [MCP Documentation](https://modelcontextprotocol.io/introduction)
- [Home Assistant Docs](https://www.home-assistant.io)
- [HA REST API](https://developers.home-assistant.io/docs/api/rest)
## License
MIT License - See [LICENSE](LICENSE) file