Build and Push / build (release) Successful in 56s
- Update all client endpoints to use /housekeeping/ prefix - Add critical rule requiring list_devices() before control actions - Add housekeeping API spec documentation 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
318 lines
5.4 KiB
Markdown
318 lines
5.4 KiB
Markdown
# Home Automation API Interface Specification
|
|
|
|
## Purpose
|
|
|
|
This document specifies the expected endpoints for a home automation abstraction layer in core-api. These endpoints will be consumed by the Tatlock Housekeeper agent and potentially other projects (scheduler, dashboards).
|
|
|
|
The goal is to provide a simplified, domain-specific interface for home automation that abstracts away the underlying platform (initially Home Assistant, but swappable).
|
|
|
|
---
|
|
|
|
## Endpoints
|
|
|
|
### Device Discovery
|
|
|
|
#### `GET /housekeeping/devices`
|
|
|
|
List available devices.
|
|
|
|
**Query Parameters:**
|
|
- `domain` (optional): Filter by device type (e.g., `light`, `switch`, `climate`, `media_player`)
|
|
- `area` (optional): Filter by area/room name
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"devices": [
|
|
{
|
|
"entity_id": "light.living_room",
|
|
"name": "Living Room Light",
|
|
"domain": "light",
|
|
"area": "Living Room",
|
|
"state": "on",
|
|
"attributes": {
|
|
"brightness": 255,
|
|
"color_temp": 370
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `GET /housekeeping/devices/{entity_id}`
|
|
|
|
Get detailed state of a specific device.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"entity_id": "light.living_room",
|
|
"name": "Living Room Light",
|
|
"domain": "light",
|
|
"area": "Living Room",
|
|
"state": "on",
|
|
"attributes": {
|
|
"brightness": 255,
|
|
"color_temp": 370,
|
|
"supported_features": ["brightness", "color_temp"]
|
|
},
|
|
"last_changed": "2025-12-16T10:30:00Z"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `GET /housekeeping/areas`
|
|
|
|
List all areas/rooms.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"areas": [
|
|
{"id": "living_room", "name": "Living Room"},
|
|
{"id": "bedroom", "name": "Bedroom"},
|
|
{"id": "kitchen", "name": "Kitchen"}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Device Control
|
|
|
|
#### `POST /housekeeping/devices/{entity_id}/control`
|
|
|
|
Control a device (turn on, turn off, toggle, or set attributes).
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"action": "turn_on",
|
|
"brightness": 128,
|
|
"color_temp": 400
|
|
}
|
|
```
|
|
|
|
- `action` (required): One of `turn_on`, `turn_off`, `toggle`
|
|
- Additional attributes vary by device type (brightness, color_temp, rgb_color, etc.)
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"entity_id": "light.living_room",
|
|
"new_state": "on",
|
|
"message": "Light turned on"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Scenes
|
|
|
|
#### `GET /housekeeping/scenes`
|
|
|
|
List available scenes.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"scenes": [
|
|
{"id": "scene.movie_night", "name": "Movie Night"},
|
|
{"id": "scene.good_morning", "name": "Good Morning"},
|
|
{"id": "scene.all_off", "name": "All Off"}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /housekeeping/scenes/{scene_id}/activate`
|
|
|
|
Activate a scene.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"scene_id": "scene.movie_night",
|
|
"message": "Scene activated"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Scripts
|
|
|
|
#### `GET /housekeeping/scripts`
|
|
|
|
List available scripts/sequences.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"scripts": [
|
|
{"id": "script.bedtime_routine", "name": "Bedtime Routine"},
|
|
{"id": "script.welcome_home", "name": "Welcome Home"}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /housekeeping/scripts/{script_id}/run`
|
|
|
|
Execute a script with optional variables.
|
|
|
|
**Request Body (optional):**
|
|
```json
|
|
{
|
|
"variables": {
|
|
"brightness_level": 50,
|
|
"target_room": "bedroom"
|
|
}
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"script_id": "script.bedtime_routine",
|
|
"message": "Script executed"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Automations
|
|
|
|
#### `GET /housekeeping/automations`
|
|
|
|
List automations and their enabled/disabled status.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"automations": [
|
|
{
|
|
"id": "automation.motion_lights",
|
|
"name": "Motion Lights",
|
|
"enabled": true
|
|
},
|
|
{
|
|
"id": "automation.night_mode",
|
|
"name": "Night Mode",
|
|
"enabled": false
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `POST /housekeeping/automations/{automation_id}/toggle`
|
|
|
|
Enable or disable an automation.
|
|
|
|
**Request Body:**
|
|
```json
|
|
{
|
|
"enabled": true
|
|
}
|
|
```
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"success": true,
|
|
"automation_id": "automation.motion_lights",
|
|
"enabled": true,
|
|
"message": "Automation enabled"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
### Utility
|
|
|
|
#### `GET /housekeeping/history`
|
|
|
|
Get state history for a device.
|
|
|
|
**Query Parameters:**
|
|
- `entity_id` (required): Device to get history for
|
|
- `hours` (optional, default 24): Hours of history to retrieve
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"entity_id": "light.living_room",
|
|
"history": [
|
|
{
|
|
"state": "on",
|
|
"timestamp": "2025-12-16T10:30:00Z",
|
|
"attributes": {"brightness": 255}
|
|
},
|
|
{
|
|
"state": "off",
|
|
"timestamp": "2025-12-16T08:00:00Z",
|
|
"attributes": {}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
#### `GET /housekeeping/health`
|
|
|
|
Health check for home automation connection.
|
|
|
|
**Response:**
|
|
```json
|
|
{
|
|
"status": "healthy",
|
|
"connected": true,
|
|
"platform": "home_assistant",
|
|
"version": "2024.12.0"
|
|
}
|
|
```
|
|
|
|
---
|
|
|
|
## Error Responses
|
|
|
|
All endpoints should return consistent error responses:
|
|
|
|
```json
|
|
{
|
|
"error": true,
|
|
"code": "DEVICE_NOT_FOUND",
|
|
"message": "Device light.nonexistent not found"
|
|
}
|
|
```
|
|
|
|
Common error codes:
|
|
- `DEVICE_NOT_FOUND` - Entity ID doesn't exist
|
|
- `INVALID_ACTION` - Unsupported action for device type
|
|
- `CONNECTION_ERROR` - Cannot reach home automation platform
|
|
- `UNAUTHORIZED` - Invalid or missing credentials
|
|
|
|
---
|
|
|
|
## Authentication
|
|
|
|
All endpoints require authentication via Bearer token in the `Authorization` header.
|
|
|
|
---
|
|
|
|
## Consuming Client
|
|
|
|
The Tatlock project has an existing client (`src/agents/housekeeper/client.py`) that expects these endpoints. No changes to Tatlock are needed once these endpoints are available.
|
|
|
|
Reference: `CoreAPIClient` class in Tatlock expects these exact endpoint patterns.
|