{"id":"4b11f3fb-fcbb-43c5-96ca-e13e452b3859","entityType":"agent","slug":"clawhub-skills-anotb-homeassistant-skill","name":"homeassistant-skill","canonicalUrl":"https://www.xpersona.co/agent/clawhub-skills-anotb-homeassistant-skill","canonicalPath":"/agent/clawhub-skills-anotb-homeassistant-skill","generatedAt":"2026-10-09T23:55:10.495Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"description":"Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, scripts, and more. Use when the user asks about their smart home, devices, or automations. --- name: homeassistant-skill description: > Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, scripts, and more. Use when the user asks about their smart home, devices, or automations. license: MIT homepage: https://github.com/anotb/homeassistant-skill compatibility: Requires curl and jq. Network access to Hom","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. Last updated 4/15/2026.","installCommand":"clawhub skill install skills:anotb:homeassistant-skill","sourceUrl":"https://github.com/openclaw/skills/tree/main/skills/anotb/homeassistant-skill","homepage":"https://github.com/anotb/homeassistant-skill","primaryLinks":[{"label":"View on ClawHub","url":"https://github.com/openclaw/skills/tree/main/skills/anotb/homeassistant-skill","kind":"source"},{"label":"Homepage","url":"https://github.com/anotb/homeassistant-skill","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":50,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, sc"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"no-adoption-signals","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No source adoption metrics were available."},"stars":null,"forks":null,"downloads":null,"packageName":null,"latestVersion":null,"tractionLabel":null},"release":{"evidence":{"source":"agent-index","verified":false,"confidence":"medium","updatedAt":"2026-02-25T03:37:16.235Z","emptyReason":null},"lastUpdatedAt":"2026-04-15T00:45:39.800Z","lastCrawledAt":"2026-02-25T03:37:16.235Z","lastIndexedAt":null,"nextCrawlAt":"2026-02-26T03:37:16.235Z","lastVerifiedAt":null,"highlights":[]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install skills:anotb:homeassistant-skill","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T23:55:10.495Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-skills-anotb-homeassistant-skill/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":null},"readme":"---\nname: homeassistant-skill\ndescription: >\n  Control Home Assistant devices and automations via REST API. 25 entity domains\n  including lights, climate, locks, presence, weather, calendars, notifications,\n  scripts, and more. Use when the user asks about their smart home, devices, or automations.\nlicense: MIT\nhomepage: https://github.com/anotb/homeassistant-skill\ncompatibility: Requires curl and jq. Network access to Home Assistant instance.\nmetadata: {\"author\": \"anotb\", \"version\": \"2.1.0\", \"openclaw\": {\"requires\": {\"env\": [\"HA_URL\", \"HA_TOKEN\"], \"bins\": [\"curl\", \"jq\"]}, \"primaryEnv\": \"HA_TOKEN\"}}\n---\n\n# Home Assistant Skill\n\nControl smart home devices via the Home Assistant REST API.\n\n## Setup\n\nSet environment variables:\n- `HA_URL` — Your Home Assistant URL (e.g., `http://10.0.0.10:8123`)\n- `HA_TOKEN` — Long-lived access token (create in HA → Profile → Long-Lived Access Tokens)\n\n## Safety Rules\n\n**Always confirm with the user before performing these actions:**\n- **Locks** — locking or unlocking any lock\n- **Alarm panels** — arming or disarming\n- **Garage doors** — opening or closing (`cover.*` with `device_class: garage`)\n- **Security automations** — disabling automations related to security or safety\n- **Covers** — opening or closing covers that control physical access (gates, barriers)\n\nNever act on security-sensitive devices without explicit user confirmation.\n\n## Entity Discovery\n\n### List all entities\n\n```bash\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[].entity_id' | sort\n```\n\n### List entities by domain\n\n```bash\n# Switches\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"switch.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Lights\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"light.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Sensors\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"sensor.\")) | \"\\(.entity_id): \\(.state) \\(.attributes.unit_of_measurement // \"\")\"'\n```\n\nReplace the domain prefix (`switch.`, `light.`, `sensor.`, etc.) to discover entities\nin any domain.\n\n### Get single entity state\n\n```bash\ncurl -s \"$HA_URL/api/states/ENTITY_ID\" -H \"Authorization: Bearer $HA_TOKEN\"\n```\n\n### Area & Floor Discovery\n\nUse the template API to query areas, floors, and labels.\n\n```bash\n# List all areas\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ areas() }}\"}'\n\n# Entities in a specific area\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ area_entities(\\\"kitchen\\\") }}\"}'\n\n# Only lights in an area\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ area_entities(\\\"kitchen\\\") | select(\\\"match\\\", \\\"light.\\\") | list }}\"}'\n\n# Find which area an entity belongs to\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ area_name(\\\"light.kitchen\\\") }}\"}'\n\n# List all floors and their areas\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{% for floor in floors() %}{{ floor }}: {{ floor_areas(floor) }}\\n{% endfor %}\"}'\n```\n\n## Switches\n\n```bash\n# Turn on\ncurl -s -X POST \"$HA_URL/api/services/switch/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"switch.office_lamp\"}'\n\n# Turn off\ncurl -s -X POST \"$HA_URL/api/services/switch/turn_off\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"switch.office_lamp\"}'\n\n# Toggle\ncurl -s -X POST \"$HA_URL/api/services/switch/toggle\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"switch.office_lamp\"}'\n```\n\n## Lights\n\n```bash\n# Turn on with brightness\ncurl -s -X POST \"$HA_URL/api/services/light/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"light.living_room\", \"brightness_pct\": 80}'\n\n# Turn on with color (RGB)\ncurl -s -X POST \"$HA_URL/api/services/light/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"light.living_room\", \"rgb_color\": [255, 150, 50]}'\n\n# Turn on with color temperature (mireds)\ncurl -s -X POST \"$HA_URL/api/services/light/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"light.living_room\", \"color_temp\": 300}'\n\n# Turn off\ncurl -s -X POST \"$HA_URL/api/services/light/turn_off\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"light.living_room\"}'\n```\n\n## Scenes\n\n```bash\ncurl -s -X POST \"$HA_URL/api/services/scene/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"scene.movie_time\"}'\n```\n\n## Scripts\n\n```bash\n# List all scripts\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"script.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Run a script\ncurl -s -X POST \"$HA_URL/api/services/script/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"script.bedtime_routine\"}'\n\n# Run a script with variables\ncurl -s -X POST \"$HA_URL/api/services/script/bedtime_routine\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"variables\": {\"brightness\": 20, \"delay_minutes\": 5}}'\n```\n\n## Automations\n\n```bash\n# List all automations\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"automation.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Trigger an automation\ncurl -s -X POST \"$HA_URL/api/services/automation/trigger\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"automation.morning_routine\"}'\n\n# Enable automation\ncurl -s -X POST \"$HA_URL/api/services/automation/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"automation.morning_routine\"}'\n\n# Disable automation\ncurl -s -X POST \"$HA_URL/api/services/automation/turn_off\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"automation.morning_routine\"}'\n```\n\n## Climate Control\n\n```bash\n# Get thermostat state\ncurl -s \"$HA_URL/api/states/climate.thermostat\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '{state: .state, current_temp: .attributes.current_temperature, target_temp: .attributes.temperature}'\n\n# Set temperature\ncurl -s -X POST \"$HA_URL/api/services/climate/set_temperature\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"climate.thermostat\", \"temperature\": 72}'\n\n# Set HVAC mode (heat, cool, auto, off)\ncurl -s -X POST \"$HA_URL/api/services/climate/set_hvac_mode\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"climate.thermostat\", \"hvac_mode\": \"auto\"}'\n```\n\n## Covers (Blinds, Garage Doors)\n\n**Safety:** Confirm with the user before opening/closing garage doors or gates.\n\n```bash\n# Open\ncurl -s -X POST \"$HA_URL/api/services/cover/open_cover\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"cover.garage_door\"}'\n\n# Close\ncurl -s -X POST \"$HA_URL/api/services/cover/close_cover\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"cover.garage_door\"}'\n\n# Set position (0 = closed, 100 = open)\ncurl -s -X POST \"$HA_URL/api/services/cover/set_cover_position\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"cover.blinds\", \"position\": 50}'\n```\n\n## Locks\n\n**Safety:** Always confirm with the user before locking/unlocking.\n\n```bash\n# Lock\ncurl -s -X POST \"$HA_URL/api/services/lock/lock\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"lock.front_door\"}'\n\n# Unlock\ncurl -s -X POST \"$HA_URL/api/services/lock/unlock\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"lock.front_door\"}'\n```\n\n## Fans\n\n```bash\n# Turn on\ncurl -s -X POST \"$HA_URL/api/services/fan/turn_on\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"fan.bedroom\", \"percentage\": 50}'\n\n# Turn off\ncurl -s -X POST \"$HA_URL/api/services/fan/turn_off\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"fan.bedroom\"}'\n```\n\n## Media Players\n\n```bash\n# Play/pause\ncurl -s -X POST \"$HA_URL/api/services/media_player/media_play_pause\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"media_player.living_room_tv\"}'\n\n# Set volume (0.0 to 1.0)\ncurl -s -X POST \"$HA_URL/api/services/media_player/volume_set\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"media_player.living_room_tv\", \"volume_level\": 0.5}'\n```\n\n## Vacuum\n\n```bash\n# Start cleaning\ncurl -s -X POST \"$HA_URL/api/services/vacuum/start\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"vacuum.robot\"}'\n\n# Return to dock\ncurl -s -X POST \"$HA_URL/api/services/vacuum/return_to_base\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"vacuum.robot\"}'\n```\n\n## Alarm Control Panel\n\n**Safety:** Always confirm with the user before arming/disarming.\n\n```bash\n# Arm (home mode)\ncurl -s -X POST \"$HA_URL/api/services/alarm_control_panel/alarm_arm_home\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"alarm_control_panel.home\"}'\n\n# Disarm (requires code if configured)\ncurl -s -X POST \"$HA_URL/api/services/alarm_control_panel/alarm_disarm\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"alarm_control_panel.home\", \"code\": \"1234\"}'\n```\n\n## Notifications\n\n```bash\n# List available notification targets\ncurl -s \"$HA_URL/api/services\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.domain == \"notify\") | .services | keys[]' | sort\n\n# Send a notification to a mobile device\ncurl -s -X POST \"$HA_URL/api/services/notify/mobile_app_phone\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"message\": \"Front door opened\", \"title\": \"Home Alert\"}'\n\n# Send to all devices (default notify service)\ncurl -s -X POST \"$HA_URL/api/services/notify/notify\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"message\": \"System alert\", \"title\": \"Home Assistant\"}'\n```\n\nReplace `mobile_app_phone` with the actual service name from the list command.\n\n## Person & Presence\n\n```bash\n# Who is home?\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"person.\")) | \"\\(.attributes.friendly_name // .entity_id): \\(.state)\"'\n\n# Device tracker locations\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"device_tracker.\")) | \"\\(.entity_id): \\(.state)\"'\n```\n\nStates: `home`, `not_home`, or a zone name.\n\n## Weather\n\n```bash\n# Current weather\ncurl -s \"$HA_URL/api/states/weather.home\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '{state: .state, temperature: .attributes.temperature, humidity: .attributes.humidity, wind_speed: .attributes.wind_speed}'\n\n# Get forecast (daily)\ncurl -s -X POST \"$HA_URL/api/services/weather/get_forecasts\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"weather.home\", \"type\": \"daily\"}'\n\n# Get forecast (hourly)\ncurl -s -X POST \"$HA_URL/api/services/weather/get_forecasts\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"weather.home\", \"type\": \"hourly\"}'\n```\n\n## Input Helpers\n\n```bash\n# Toggle an input boolean\ncurl -s -X POST \"$HA_URL/api/services/input_boolean/toggle\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"input_boolean.guest_mode\"}'\n\n# Set input number\ncurl -s -X POST \"$HA_URL/api/services/input_number/set_value\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"input_number.target_temperature\", \"value\": 72}'\n\n# Set input select\ncurl -s -X POST \"$HA_URL/api/services/input_select/select_option\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"input_select.house_mode\", \"option\": \"Away\"}'\n\n# Set input text\ncurl -s -X POST \"$HA_URL/api/services/input_text/set_value\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"input_text.welcome_message\", \"value\": \"Welcome home!\"}'\n\n# Set input datetime\ncurl -s -X POST \"$HA_URL/api/services/input_datetime/set_datetime\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"input_datetime.alarm_time\", \"time\": \"07:30:00\"}'\n```\n\n## Calendar\n\n```bash\n# List all calendars\ncurl -s \"$HA_URL/api/calendars\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[].entity_id'\n\n# Get upcoming events (next 7 days)\ncurl -s \"$HA_URL/api/calendars/calendar.personal?start=$(date -u +%Y-%m-%dT%H:%M:%S.000Z)&end=$(date -u -v+7d +%Y-%m-%dT%H:%M:%S.000Z)\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '[.[] | {summary: .summary, start: .start.dateTime, end: .end.dateTime}]'\n```\n\n## Text-to-Speech\n\n```bash\ncurl -s -X POST \"$HA_URL/api/services/tts/speak\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"tts.google_en\", \"media_player_entity_id\": \"media_player.living_room_speaker\", \"message\": \"Dinner is ready\"}'\n```\n\nReplace `tts.google_en` with your TTS entity and `media_player.living_room_speaker` with the target speaker.\n\n## Call Any Service\n\nThe general pattern for any HA service:\n\n```bash\ncurl -s -X POST \"$HA_URL/api/services/{domain}/{service}\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": \"domain.entity_name\", ...}'\n```\n\n### Batch operations\n\nControl multiple entities in one call by passing an array of entity IDs:\n\n```bash\n# Turn off all living room lights at once\ncurl -s -X POST \"$HA_URL/api/services/light/turn_off\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"entity_id\": [\"light.living_room\", \"light.living_room_lamp\", \"light.living_room_ceiling\"]}'\n```\n\n## Error Handling\n\n### Check API connectivity\n\n```bash\ncurl -s -o /dev/null -w \"%{http_code}\" \"$HA_URL/api/\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\"\n# Expect: 200\n```\n\n### Verify entity exists before acting\n\n```bash\nHTTP_CODE=$(curl -s -o /dev/null -w \"%{http_code}\" \\\n  \"$HA_URL/api/states/light.nonexistent\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\")\n# 200 = exists, 404 = not found\n```\n\n### HTTP status codes\n\n| Code | Meaning |\n|------|---------|\n| 200 | Success |\n| 400 | Bad request (malformed JSON or invalid service data) |\n| 401 | Unauthorized (bad or missing token) |\n| 404 | Entity or endpoint not found |\n| 405 | Method not allowed (wrong HTTP method) |\n| 503 | Home Assistant is starting up or unavailable |\n\n## Response Format\n\nService calls return an array of state objects for affected entities:\n\n```json\n[{\"entity_id\": \"light.living_room\", \"state\": \"on\", \"attributes\": {...}, \"last_changed\": \"...\"}]\n```\n\n- Successful call with no state change: returns `[]` (empty array)\n- State read (`/api/states/...`): returns a single state object\n- Errors: returns `{\"message\": \"...\"}` with an HTTP error code\n\n## Template Evaluation\n\nThe `/api/template` endpoint evaluates Jinja2 templates server-side. Useful for computed queries.\n\n```bash\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"TEMPLATE_STRING\"}'\n```\n\n### Examples\n\n```bash\n# Count entities by domain\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ states.light | list | count }} lights\"}'\n\n# Get entity state in a template\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ states(\\\"light.living_room\\\") }}\"}'\n\n# List all entities that are \"on\"\ncurl -s -X POST \"$HA_URL/api/template\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"template\": \"{{ states | selectattr(\\\"state\\\", \\\"eq\\\", \\\"on\\\") | map(attribute=\\\"entity_id\\\") | list }}\"}'\n```\n\nAvailable template functions: `states()`, `is_state()`, `state_attr()`, `areas()`, `area_entities()`, `area_name()`, `floors()`, `floor_areas()`, `labels()`, `label_entities()`, `devices()`, `device_entities()`, `now()`, `relative_time()`.\n\n## History & Logbook\n\n### Entity state history\n\n```bash\n# Last 24 hours for a specific entity\ncurl -s \"$HA_URL/api/history/period?filter_entity_id=sensor.temperature\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '.[0] | [.[] | {state: .state, last_changed: .last_changed}]'\n\n# Specific time range (ISO 8601)\ncurl -s \"$HA_URL/api/history/period/2025-01-15T00:00:00Z?end_time=2025-01-15T23:59:59Z&filter_entity_id=sensor.temperature\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '.[0]'\n```\n\n### Logbook\n\n```bash\n# Recent logbook entries\ncurl -s \"$HA_URL/api/logbook\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '.[:10]'\n\n# Logbook for a specific entity\ncurl -s \"$HA_URL/api/logbook?entity=light.living_room\" \\\n  -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq '.[:10] | [.[] | {name: .name, message: .message, when: .when}]'\n```\n\n## Dashboard Overview\n\nQuick status of all active devices:\n\n```bash\n# All lights that are on\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"light.\")) | select(.state == \"on\") | .entity_id'\n\n# All open doors/windows (binary sensors)\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"binary_sensor.\")) | select(.state == \"on\") | select(.attributes.device_class == \"door\" or .attributes.device_class == \"window\") | .entity_id'\n\n# Temperature sensors\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"sensor.\")) | select(.attributes.device_class == \"temperature\") | \"\\(.attributes.friendly_name // .entity_id): \\(.state)\\(.attributes.unit_of_measurement // \"\")\"'\n\n# Climate summary (all thermostats)\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"climate.\")) | \"\\(.attributes.friendly_name // .entity_id): \\(.state), current: \\(.attributes.current_temperature)°, target: \\(.attributes.temperature)°\"'\n\n# Lock status\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"lock.\")) | \"\\(.attributes.friendly_name // .entity_id): \\(.state)\"'\n\n# Who is home\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"person.\")) | \"\\(.attributes.friendly_name // .entity_id): \\(.state)\"'\n```\n\n## Entity Domains\n\n| Domain | Examples |\n|--------|----------|\n| `switch.*` | Smart plugs, generic switches |\n| `light.*` | Lights (Hue, LIFX, etc.) |\n| `scene.*` | Pre-configured scenes |\n| `script.*` | Reusable action sequences |\n| `automation.*` | Automations |\n| `climate.*` | Thermostats, AC units |\n| `cover.*` | Blinds, garage doors, gates |\n| `lock.*` | Smart locks |\n| `fan.*` | Fans, ventilation |\n| `media_player.*` | TVs, speakers, streaming devices |\n| `vacuum.*` | Robot vacuums |\n| `alarm_control_panel.*` | Security systems |\n| `notify.*` | Notification targets |\n| `person.*` | People / presence tracking |\n| `device_tracker.*` | Device locations |\n| `weather.*` | Weather conditions and forecasts |\n| `calendar.*` | Calendar events |\n| `tts.*` | Text-to-speech engines |\n| `sensor.*` | Temperature, humidity, power, etc. |\n| `binary_sensor.*` | Motion, door/window, presence |\n| `input_boolean.*` | Virtual toggles |\n| `input_number.*` | Numeric sliders |\n| `input_select.*` | Dropdown selectors |\n| `input_text.*` | Text inputs |\n| `input_datetime.*` | Date/time inputs |\n\n## Notes\n\n- API returns JSON by default\n- Long-lived tokens don't expire — store securely\n- Test entity IDs with the list command first\n- For locks, alarms, and garage doors — always confirm actions with the user\n","readmeExcerpt":"--- name: homeassistant-skill description: > Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, scripts, and more. Use when the user asks about their smart home, devices, or automations. license: MIT homepage: https://github.com/anotb/homeassistant-skill compatibility: Requires curl and jq. Network access to Hom","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"curl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\"},{"language":"bash","snippet":"curl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[].entity_id' | sort"},{"language":"bash","snippet":"curl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\"},{"language":"bash","snippet":"curl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\"},{"language":"bash","snippet":"curl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\"},{"language":"bash","snippet":"# Switches\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"switch.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Lights\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"light.\")) | \"\\(.entity_id): \\(.state)\"'\n\n# Sensors\ncurl -s \"$HA_URL/api/states\" -H \"Authorization: Bearer $HA_TOKEN\" \\\n  | jq -r '.[] | select(.entity_id | startswith(\"sensor.\")) | \"\\(.entity_id): \\(.state) \\(.attributes.unit_of_measurement // \"\")\"'"}],"parameters":{},"dependencies":[],"permissions":[],"extractedFiles":[],"languages":["typescript"],"docsSourceLabel":"CLAWHUB","editorialOverview":"Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, scripts, and more. Use when the user asks about their smart home, devices, or automations. --- name: homeassistant-skill description: > Control Home Assistant devices and automations via REST API. 25 entity domains including lights, climate, locks, presence, weather, calendars, notifications, scripts, and more. Use when the user asks about their smart home, devices, or automations. license: MIT homepage: https://github.com/anotb/homeassistant-skill compatibility: Requires curl and jq. Network access to Hom","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":396,"uniquenessScore":65,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-04-15T00:45:39.800Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T23:55:10.495Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}