Overview
Installation
Content Details
Alternatives
What is Hubitat MCP Server?
Hubitat MCP Server is an application that runs on the Hubitat smart home hub. It implements the Model Context Protocol (MCP), enabling AI assistants (such as Claude) to interact with your smart home system through natural language. You can control devices, query status, and create automation rules just like having a conversation with a person, without writing complex code or using specialized applications.How to use Hubitat MCP Server?
The usage process is very simple: 1) Install the MCP server application on the Hubitat hub; 2) Obtain the access endpoint URL; 3) Configure the URL in the AI client (such as Claude Desktop or Claude.ai); 4) Start controlling your smart home with natural language. The whole process does not require an additional server or complex network configuration.Applicable scenarios
Suitable for users who want to control smart homes with natural language, non - technical users who need to quickly create complex automation rules, families who want to manage multiple smart devices through AI, and scenarios that require remote access and control of the home system.Main features
How to use
Usage examples
Frequently Asked Questions
Related resources
Installation
{
"mcpServers": {
"hubitat": {
"type": "url",
"url": "http://192.168.1.100/apps/api/123/mcp?access_token=YOUR_TOKEN"
}
}
}
{
"mcpServers": {
"hubitat": {
"type": "url",
"url": "http://YOUR_HUB_IP/apps/api/123/mcp?access_token=YOUR_TOKEN"
}
}
}🚀 Hubitat MCP Server
A native Model Context Protocol (MCP) server running directly on your Hubitat Elevation hub, enabling AI assistants to control your smart home via natural language.
🚀 Quick Start
1. Add the App
- Navigate to Apps > + Add User App > MCP Rule Server.
- Select the devices you want to access via MCP.
- Click Done.
- Open the app to view your endpoint URLs and manage rules.
2. Get Your Endpoint URL
The app provides two endpoint URLs:
- Local Endpoint — for local network use:
http://192.168.1.100/apps/api/123/mcp?access_token=YOUR_TOKEN - Cloud Endpoint — for remote access (requires a Hubitat Cloud subscription):
https://cloud.hubitat.com/api/YOUR_HUB_ID/apps/123/mcp?access_token=YOUR_TOKEN
3. Connect Your AI Client
⚠️ Important Note
This server uses Streamable HTTP (not SSE or stdio). Your MCP client must support HTTP transport, which most do by default.
Claude Code (CLI)
Add the following to your MCP settings file (~/.claude.json or project .mcp.json):
{
"mcpServers": {
"hubitat": {
"type": "url",
"url": "http://192.168.1.100/apps/api/123/mcp?access_token=YOUR_TOKEN"
}
}
}
For remote access, use the Hubitat Cloud URL instead.
Claude Desktop
Add the following to your Claude Desktop config file:
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - Windows:
%APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"hubitat": {
"type": "url",
"url": "http://YOUR_HUB_IP/apps/api/123/mcp?access_token=YOUR_TOKEN"
}
}
}
Claude.ai (Connectors)
Claude.ai supports MCP servers through Connectors:
- Go to claude.ai > Settings > Connectors.
- Add a new connector with your Hubitat endpoint URL.
- Use the Cloud Endpoint URL for remote access, or a Cloudflare Tunnel URL.
With Hubitat Cloud, you can control your smart home from claude.ai anywhere without local setup.
Other AI Services
Any AI service supporting MCP servers via HTTP URL can use this server. You can choose either:
- Hubitat Cloud URL — no additional setup needed with a Hubitat Cloud subscription.
- Cloudflare Tunnel — for free self - hosted remote access (see Remote Access Options).
✨ Features
MCP Tools (69 total — 30 on tools/list)
The server offers 69 tools in total. To keep the MCP tools/list manageable, 21 core tools are always visible, and 48 additional tools are organized behind 9 domain - named gateways. The AI sees 30 items on tools/list (21 + 9 gateways). Each gateway's description includes tool summaries (always visible to the AI), and calling a gateway without arguments returns full parameter schemas on demand.
Core Tools (21) — Always visible on tools/list
Devices (5) — Control and query devices
| Tool | Description | |------|-------------| | `list_devices` | List accessible devices (supports pagination) | | `get_device` | Full device details: attributes, commands, capabilities | | `get_attribute` | Get a specific attribute value | | `send_command` | Send a command (on, off, setLevel, etc.) | | `get_device_events` | Recent events for a device |Rules (4) — Create and manage automation rules
| Tool | Description | |------|-------------| | `list_rules` | List all rules with status | | `get_rule` | Full rule details (triggers, conditions, actions) | | `create_rule` | Create a new automation rule | | `update_rule` | Update rule triggers, conditions, actions, or enabled state (`enabled=true/false`) |Device Management (1)
| Tool | Description | |------|-------------| | `update_device` | Update device properties (label, room, preferences, etc.) |System (5) — Hub modes, HSM, and info
| Tool | Description | |------|-------------| | `get_hub_info` | Comprehensive hub info: hardware, health, MCP stats. PII (name, IP, location) requires Hub Admin Read | | `get_modes` | List location modes | | `set_mode` | Change location mode (Home, Away, Night, etc.) | | `get_hsm_status` | Get Home Security Monitor status | | `set_hsm` | Change HSM arm mode |Virtual Devices (2) — MCP-managed virtual devices
| Tool | Description | |------|-------------| | `manage_virtual_device` | Create or delete an MCP-managed virtual device (`action`: "create", "delete") (Hub Admin Write) | | `list_virtual_devices` | List MCP-managed virtual devices with states |Hub Utilities (3) — Backup, updates, and diagnostics
| Tool | Description | |------|-------------| | `create_hub_backup` | Create full hub backup (required before admin writes) | | `check_for_update` | Check if a newer MCP server version is available | | `generate_bug_report` | Generate comprehensive diagnostic report |Reference (1)
| Tool | Description | |------|-------------| | `get_tool_guide` | Full tool reference from the MCP server itself |Gateway Tools (9) — Each gateway proxies multiple tools
Call a gateway without arguments to view full parameter schemas. Call with tool='<name>' and args={...} to execute a specific tool.
manage_rules_admin (5) — Rule administration
| Tool | Description | |------|-------------| | `delete_rule` | Permanently delete a rule (auto - backs up first) | | `test_rule` | Dry - run a rule without executing actions | | `export_rule` | Export rule to JSON for backup/sharing | | `import_rule` | Import rule from exported JSON | | `clone_rule` | Clone an existing rule (starts disabled) |manage_hub_variables (3) — Hub variables
| Tool | Description | |------|-------------| | `list_variables` | List all hub connector and rule engine variables | | `get_variable` | Get a variable value | | `set_variable` | Set a variable value (creates if doesn't exist) |manage_rooms (5) — Room management
| Tool | Description | |------|-------------| | `list_rooms` | List all rooms with IDs, names, and device counts | | `get_room` | Get room details with assigned devices | | `create_room` | Create a new room (Hub Admin Write + confirm) | | `delete_room` | Permanently delete a room (Hub Admin Write + confirm) | | `rename_room` | Rename a room (Hub Admin Write + confirm) |manage_destructive_hub_ops (3) — Destructive hub operations
| Tool | Description | |------|-------------| | `reboot_hub` | Reboot the hub (1 - 3 min downtime) | | `shutdown_hub` | Power OFF the hub (requires physical restart) | | `delete_device` | Permanently delete any device (**no undo**) |All operations are disruptive. Hub admin tools require Hub Admin Read/Write to be enabled in settings. Write tools enforce a three - layer safety gate: Hub Admin Write enabled + hub backup within 24 hours + explicit confirm=true.
manage_apps_drivers (6) — App/driver listing, source code, and backups (read - only)
| Tool | Description | |------|-------------| | `list_hub_apps` | List all installed apps on the hub | | `list_hub_drivers` | List all installed drivers on the hub | | `get_app_source` | Get app Groovy source code | | `get_driver_source` | Get driver Groovy source code | | `list_item_backups` | List auto - created source code backups | | `get_item_backup` | Get source from a backup |manage_app_driver_code (7) — Install, update, delete apps/drivers and restore backups
| Tool | Description | |------|-------------| | `install_app` | Install new app from Groovy source | | `install_driver` | Install new driver from Groovy source | | `update_app_code` | Modify existing app code | | `update_driver_code` | Modify existing driver code | | `delete_app` | Permanently delete an app (auto - backs up) | | `delete_driver` | Permanently delete a driver (auto - backs up) | | `restore_item_backup` | Restore app/driver to backed - up version |Source code is automatically backed up before any modify/delete operation.
manage_logs (6) — Logs and log configuration
| Tool | Description | |------|-------------| | `get_hub_logs` | Hub log entries with level/source filtering | | `get_device_history` | Up to 7 days of device event history | | `get_debug_logs` | Retrieve MCP debug log entries | | `clear_debug_logs` | Clear all MCP debug logs | | `set_log_level` | Set MCP log level (debug/info/warn/error) | | `get_logging_status` | Get logging system status and capacity |Monitoring tools require Hub Admin Read to be enabled.
manage_diagnostics (9) — Diagnostics, performance, radio details, and state capture
| Tool | Description | |------|-------------| | `get_set_hub_metrics` | Record/retrieve hub metrics with CSV trend history | | `device_health_check` | Find stale/offline devices | | `get_rule_diagnostics` | Comprehensive diagnostics for a specific rule | | `get_zwave_details` | Z - Wave radio info (firmware, devices) | | `get_zigbee_details` | Zigbee radio info (channel, PAN ID, devices) | | `zwave_repair` | Z - Wave network repair (5 - 30 min) | | `list_captured_states` | List saved device state snapshots | | `delete_captured_state` | Delete a specific state snapshot | | `clear_captured_states` | Delete all state snapshots |manage_files (4) — Hub File Manager
| Tool | Description | |------|-------------| | `list_files` | List all files in File Manager | | `read_file` | Read a file's contents | | `write_file` | Create or update a file (auto - backs up existing) | | `delete_file` | Delete a file (auto - backs up first) |Write/delete require Hub Admin Write + confirm.
Rule Engine
Create automations via natural language — the AI translates your request into rules with triggers, conditions, and actions. You can also manage rules through the Hubitat web UI.
Supported Triggers (6 types)
| Type | Description | |------|-------------| | `device_event` | When a device attribute changes (with optional duration for debouncing) | | `button_event` | Button pressed, held, double - tapped, or released | | `time` | At a specific time, or relative to sunrise/sunset with offset | | `periodic` | Repeat at intervals (minutes, hours, or days) | | `mode_change` | When hub mode changes | | `hsm_change` | When HSM status changes |Supported Conditions (14 types)
| Type | Description | |------|-------------| | `device_state` | Check current device attribute value | | `device_was` | Device has been in state for X seconds (anti - cycling) | | `time_range` | Within a time window (supports sunrise/sunset) | | `mode` | Current hub mode | | `variable` | Hub or rule - local variable value | | `days_of_week` | Specific days | | `sun_position` | Sun above or below horizon | | `hsm_status` | Current HSM arm status | | `presence` | Presence sensor status | | `lock` | Lock status | | `thermostat_mode` | Thermostat operating mode | | `thermostat_state` | Thermostat operating state | | `illuminance` | Light level (lux) with comparison | | `power` | Power consumption (watts) with comparison |Supported Actions (29 types)
| Type | Description | |------|-------------| | `device_command` | Send command to device | | `toggle_device` | Toggle device on/off | | `activate_scene` | Activate a scene device | | `set_level` | Set dimmer level with optional duration | | `set_color` | Set color on RGB devices | | `set_color_temperature` | Set color temperature | | `lock` / `unlock` | Lock or unlock a device | | `set_variable` | Set a global variable | | `set_local_variable` | Set a rule - scoped variable | | `set_mode` | Change hub mode | | `set_hsm` | Change HSM arm mode | | `delay` | Wait before next action (with optional ID for cancellation) | | `if_then_else` | Conditional branching | | `cancel_delayed` | Cancel pending delayed actions | | `repeat` | Repeat actions N times | | `stop` | Stop rule execution | | `log` | Write to Hubitat logs | | `capture_state` / `restore_state` | Save and restore device states | | `send_notification` | Push notification | | `set_thermostat` | Thermostat mode, setpoints, fan mode | | `http_request` | HTTP GET/POST (webhooks, external APIs) | | `speak` | Text - to - speech with optional volume | | `comment` | Documentation - only (no - op) | | `set_valve` | Open or close a valve | | `set_fan_speed` | Set fan speed | | `set_shade` | Open, close, or position window shades | | `variable_math` | Arithmetic on variables |Rule Examples
Motion-activated light:
{
"name": "Motion Light",
"triggers": [
{ "type": "device_event", "deviceId": "123", "attribute": "motion", "value": "active" }
],
"conditions": [
{ "type": "time_range", "startTime": "sunset", "endTime": "sunrise" }
],
"actions": [
{ "type": "device_command", "deviceId": "456", "command": "on" },
{ "type": "delay", "seconds": 300, "delayId": "motion-off" },
{ "type": "device_command", "deviceId": "456", "command": "off" }
]
}
Temperature with debouncing:
{
"name": "AC On When Hot",
"triggers": [
{ "type": "device_event", "deviceId": "1", "attribute": "temperature",
"operator": ">", "value": "78", "duration": 300 }
],
"actions": [
{ "type": "device_command", "deviceId": "8", "command": "on" }
]
}
Button state machine with local variables:
{
"name": "Smart Button Toggle",
"localVariables": { "lastScene": "natural" },
"triggers": [
{ "type": "button_event", "deviceId": "80", "action": "pushed" }
],
"actions": [
{
"type": "if_then_else",
"condition": { "type": "variable", "variableName": "lastScene",
"operator": "equals", "value": "natural" },
"thenActions": [
{ "type": "activate_scene", "sceneDeviceId": "nightlight-scene" },
{ "type": "set_local_variable", "variableName": "lastScene", "value": "nightlight" }
],
"elseActions": [
{ "type": "activate_scene", "sceneDeviceId": "natural-scene" },
{ "type": "set_local_variable", "variableName": "lastScene", "value": "natural" }
]
}
]
}
📦 Installation
Option A: Hubitat Package Manager (Recommended)
If you haven't installed Hubitat Package Manager (HPM) yet, follow the HPM installation instructions to set it up first.
Once HPM is installed:
- Open HPM > Install.
- Search for "MCP".
- Select MCP Rule Server and install.
That's it! HPM will automatically install both the parent app and child app and notify you when updates are available.
💡 Usage Tip
You can also use HPM > Install > From a URL and paste:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/packageManifest.json
Option B: Manual Installation
You need to install two app files:
1. Install the Parent App (MCP Rule Server):
- Go to Hubitat web UI > Apps Code > + New App.
- Click Import and paste this URL:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/hubitat-mcp-server.groovy - Click Import > OK > Save.
- Click OAuth > Enable OAuth in App > Save.
2. Install the Child App (MCP Rule):
- Go to Apps Code > + New App.
- Click Import and paste this URL:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/hubitat-mcp-rule.groovy - Click Import > OK > Save.
- (No OAuth needed for the child app)
🔧 Technical Details
Hub Admin Tools
Both Hub Admin Read and Hub Admin Write access are disabled by default and must be explicitly enabled in app settings.
Enabling Hub Admin Tools
1. Open **Apps** > **MCP Rule Server** in the Hubitat web UI. 2. Under **Hub Admin Access**, toggle: - **Enable Hub Admin Read Tools** — for read - only hub information. - **Enable Hub Admin Write Tools** — for backup, reboot, shutdown, Z - Wave repair, and app/driver management. 3. If your hub has **Hub Security** enabled, also configure: - **Hub Security Username** and **Password** under the Hub Security section.Safety Gates
All Hub Admin Write tools enforce a **three - layer safety gate**: 1. Hub Admin Write must be **enabled** in settings. 2. The AI must pass `confirm=true` explicitly. 3. A full hub **backup must exist within the last 24 hours** (enforced automatically).Additionally, tools that modify or delete existing apps/drivers automatically back up the item's source code before making changes.
Item Backup & Restore
When you use `update_app_code`, `update_driver_code`, `delete_app`, or `delete_driver`, the server automatically saves the **original source code** before making changes. - Backups are stored as `.groovy` files in the hub's local **File Manager**. - Named `mcp-backup-app-Restore via MCP:
- Use
list_item_backupsto view available backups. - Use
restore_item_backupwith the backup key andconfirm=true.
Restore manually (without MCP):
- Go to Hubitat web UI > Settings > File Manager.
- Download the backup file (e.g.,
mcp-backup-app-123.groovy). - Go to Apps Code (or Drivers Code) > select the app > paste the source > Save.
Hub Security Support
If your hub has Hub Security enabled (login required for the web UI), the MCP server handles authentication automatically: - Configure your Hub Security username and password in the app settings. - The server caches the session cookie for 30 minutes. - Stale cookies are automatically cleared and re - authenticated. - If Hub Security is not enabled, no credentials are needed.Performance & Limits
Hub Hardware Recommendations
| Hub Model | Recommendation | |-----------|----------------| | **C - 7** | Suitable for basic use, may be slow with large device lists or complex rules | | **C - 8** | Good for most users | | **C - 8 Pro** | Ideal for heavy use, large device counts (100+), or complex automations |Known Limits
- **`list_devices` with `detailed=true`** — Can be slow on 50+ devices. Use pagination: `list_devices(detailed=true, limit=25, offset=0)`. - **Duration triggers** — Maximum of 2 hours (7200 seconds). - **Captured states** — Default limit of 20 (configurable 1 - 100 in settings). - **Hubitat Cloud responses** — 128KB maximum (AWS MQTT limit). Use pagination for large device lists. - No real - time event streaming (MCP responses only). - Sunrise/sunset times are recalculated daily.Troubleshooting
Device not found
Ensure the device is selected in the app's "Select Devices for MCP Access" setting.OAuth token not working
1. Open Apps Code > MCP Rule Server. 2. Click OAuth > Enable OAuth in App. 3. Save. 4. Re - open the app in Apps to get the new token.Rules not triggering
- Check that "Enable Rule Engine" is on in app settings. - Enable "Debug Logging" and check Hubitat Logs. - Verify the trigger device is selected for MCP access. - For duration - based triggers, ensure the condition stays true for the full duration.Button events not working
- Make sure you're using the `button_event` trigger type (not `device_event`). - Verify the button action type: `pushed`, `held`, `doubleTapped`, or `released`.list_devices(detailed=true) fails over Hubitat Cloud
Hubitat Cloud has a **128KB response size limit** (AWS MQTT limitation). Use pagination: ``` list_devices(detailed=true, limit=25, offset=0) // First 25 devices list_devices(detailed=true, limit=25, offset=25) // Next 25 devices ``` The response includes `total`, `hasMore`, and `nextOffset` to assist with pagination.Rules from v0.0.x not showing
Version 0.1.0 uses a new parent/child architecture. Old rules stored in `state.rules` are not migrated automatically. You'll need to recreate rules either through the UI or via MCP.Reporting bugs
For easier bug reporting: 1. Set the debug log level: Settings > MCP Debug Log Level > "Debug", or ask your AI to use `set_log_level` to set it to "debug". 2. Reproduce the issue. 3. Ask your AI to use the `generate_bug_report` tool — it will gather diagnostics and format a ready - to - submit report. 4. Submit the report at [GitHub Issues](https://github.com/kingpanther13/Hubitat-local-MCP-server/issues).Future Plans
Future Plans
> **Blue - sky ideas** — everything below is speculative and needs further research to determine feasibility. None of these features are guaranteed or committed to.
>
> **Status key:** `[ ]` = not started | `[~]` = in progress / partially done | `[x]` = completed | `[?]` = needs research / feasibility unknown
>
> **Feasibility research conducted February 2025.** Each item now includes a difficulty rating (1–5), effort estimate, and implementation notes based on a thorough codebase analysis.
>
> **Difficulty key:** `1` = trivial | `2` = straightforward | `3` = moderate | `4` = complex | `5` = extremely complex
>
> **Effort key:** `S` = small (hours) | `M` = medium (1–3 days) | `L` = large (4+ days)
Rule Engine Enhancements
Trigger Enhancements
-
[x] Conditional triggers (evaluate at trigger time) —
Difficulty: 1 | Effort: SAlready implemented. The
evaluateTriggerCondition()method evaluates a per - triggerconditionfield using the full condition system. Every trigger handler already calls this. May benefit from better documentation and MCP tool schema updates to make the feature more discoverable. -
[x] Cron/periodic triggers —
Difficulty: 1 | Effort: SAlready implemented. The
periodictrigger type internally generates cron expressions viaschedule(). To expose raw cron support, add acronsub - type that passes user - provided cron expressions directly. Hubitat accepts standard 7 - field cron expressions. User - provided strings would need validation. -
[ ] Endpoint/webhook triggers —
Difficulty: 3 | Effort: MFeasible. Add a single dispatcher endpoint (e.g.,
/mcp/webhook?ruleKey=<key>) in the parent app'smappingsblock. The parent looks up the child rule by key and callsexecuteRule("webhook", webhookEvt)with the request body/params as event data. Per - rule dynamic paths are not possible sincemappingsare compile - time, but a shared endpoint with a query parameter works. The OAuth access token already protects the path.Implementation plan:
- Add
GET/POST /webhookmapping to the parent app. - Add
webhooktrigger type to the child app'ssubscribeToTriggers(). - Parent dispatches to matching child rule via key lookup.
- Package request body, headers, and query params into a pseudo - event for variable substitution.
- Add
-
[ ] Hub variable change triggers —
Difficulty: 3 | Effort: MPartially feasible. Hubitat does not expose a native
subscribe()for hub variable changes. Two approaches: (A) Polling — useschedule()every 5–10 seconds to compare the current value against the last known value inatomicState. Adds latency and hub load. (B) Variable Connector workaround — Hubitat's Variable Connector feature (firmware ≥ 2.3.4) exposes hub variables as device attributes, which can be subscribed to via the existingdevice_eventtrigger. Option B is cleaner but requires the user to create Variable Connector devices.Implementation plan:
- Add
variable_changetrigger type with a configurable polling interval. - Store last - known values in
atomicState.variableSnapshots. - On each poll cycle, compare and fire the rule if changed.
- Document the Variable Connector approach as the preferred alternative.
- Add
-
[ ] System start trigger —
Difficulty: 2 | Effort: SFeasible. Hubitat supports
subscribe(location, "systemStart", handler). Add asystem_starttrigger type. After hub reboot, the app restores,initialize()→subscribeToTriggers()runs, and the systemStart event fires the rule. Minor edge case: the event may fire before all apps finish restoring — needs testing on hardware.Implementation plan:
- Add
system_starttrigger type to the child app. - Subscribe to
location "systemStart"event insubscribeToTriggers(). - Handler calls
executeRule("system_start").
- Add
-
[ ] Date range triggers —
Difficulty: 2 | Effort: SFeasible. Better implemented as a condition than a trigger. A
date_rangecondition type checksnew Date()against start/end dates, following the same pattern astime_rangeanddays_of_week. If implemented as a trigger, useschedule()to fire at range start.java.util.Calendaris available in the sandbox.Implementation plan:
- Add
date_rangecondition type toevaluateCondition(). - Accept
startDateandendDate(ISO format). - Optionally add a
date_rangetrigger that schedules a one - time event at range start.
- Add
Condition Enhancements
-
[ ] Required Expressions (rule gates) with in - flight action cancellation —
Difficulty: 4 | Effort: LFeasible but complex. A "gate" is a condition continuously monitored during action execution. If it becomes false, in - flight delayed actions are cancelled. The existing
cancelledDelayIdsmechanism provides the foundation for cancellation. The gate needs its ownsubscribe()calls for relevant devices, with a handler that checks the gate condition and marks all pending delay IDs as cancelled. This is the most architecturally complex enhancement — it requires asynchronous monitoring during delayed action chains and careful state management.Implementation plan:
- Add
requiredExpressionsarray to the rule structure alongsideconditions. - Subscribe to gate - relevant device events separately.
- Gate handler evaluates conditions and cancels all active delays if false.
- Track all active delay IDs per rule in
atomicState.activeDelayIds. - Add cleanup logic when rule execution completes normally.
- Add
-
[ ] Full boolean expression builder (AND/OR/XOR/NOT with nesting) —
Difficulty: 4 | Effort: LFeasible. Replace the flat conditions array +
conditionLogictoggle with a recursive tree structure:{operator: "AND", operands: [...]}. RewriteevaluateConditions()as a tree walker. NOT wraps a single operand; XOR checks exactly one true. The existingevaluateCondition()for leaf nodes is already modular. The main challenge is MCP tool ergonomics and backward compatibility — the flat array format would need migration logic.Implementation plan:
- Define tree data structure with
operatorandoperandsfields. - Implement recursive
evaluateConditionTree()method. - Support both legacy flat format and new tree format (migration path).
- Update
create_rule/update_ruletool schemas. - Update
describeCondition()for recursive formatting.
- Define tree data structure with
-
[ ] Private Boolean per rule —
Difficulty: 2 | Effort: SFeasible. Already achievable via
atomicState.localVariables. Add a dedicatedset_rule_booleanaction type that callsparent.setRuleBooleanOnChild(targetRuleId, boolName, value), which updates the target child's local variables. Add arule_booleancondition type that reads a specific rule's local variables. The parent mediates cross - rule access viagetChildAppById().Implementation plan:
- Add
set_rule_booleanaction type to the child app. - Add
rule_booleancondition type toevaluateCondition(). - Add
setRuleBooleanOnChild()method to the parent app. - Update MCP tool schemas.
- Add
Action Enhancements
-
[ ] Fade dimmer over time —
Difficulty: 3 | Effort: MFeasible. Many dimmers natively support
setLevel(level, duration)which the codebase already uses. For a software fade: calculate step size and interval, then userunIn()with incremental steps. Example: 0→100 over 60s = 5% every 3 seconds (20 steps). Limit steps to ~20–30 to avoid overwhelming the hub's scheduler. Share the stepping utility with color temperature fading and ramp actions.Implementation plan:
- Add
fade_dimmeraction type withstartLevel,endLevel,durationSeconds. - Implement
rampValue()utility for steppedrunIn()scheduling. - Use
[overwrite: false]onrunIn()for non - conflicting callbacks. - Fall back to native
setLevel(level, duration)when the device supports it.
- Add
-
[ ] Change color temperature over time —
Difficulty: 3 | Effort: MFeasible. Same pattern as fade dimmer. Use the shared
rampValue()utility withsetColorTemperature()calls at each step. Some devices supportsetColorTemperature(temp, level, duration)natively. Temperature ranges vary by device (typically 2000K–6500K).Implementation plan:
- Add
fade_color_temperatureaction type withstartTemp,endTemp,durationSeconds. - Reuse the
rampValue()utility from fade dimmer. - Handle integer rounding for temperature steps.
- Add
-
[ ] Per - mode actions —
Difficulty: 2 | Effort: SFeasible. Add a
per_modeaction type containing a map of mode - name to action - list. At execution time, checklocation.modeand execute the matching action list. Structurally similar toif_then_elsebut with multiple branches. The existingif_then_elsewith amodecondition already provides this capability less ergonomically.Implementation plan:
- Add
per_modeaction type withmodeActionsmap. - Look up
location.modeat execution time. - Execute matching action list using existing
executeAction()infrastructure.
- Add
-
[ ] Wait for Event / Wait for Expression —
Difficulty: 5 | Effort: LPartially feasible. Requires pausing execution mid - stream until an external event occurs. In Hubitat's single - threaded model, there is no blocking wait. Implementation: save current execution state (action index, context) to
atomicState, subscribe to the target event, return from execution, then resume when the event fires — similar to thedelaypattern but event - triggered. A mandatory timeout is essential. Race conditions between the wait subscription and other triggers are possible.Implementation plan:
- Add
wait_for_eventaction type with target device/attribute and mandatory timeout. - Save execution state to
atomicState(same pattern asdelay). - Create temporary subscription for the target event.
- On event fire or timeout, resume execution from saved state.
- Clean up subscription after resume.
- Add
-
[ ] Repeat While / Repeat Until —
Difficulty: 4 | Effort: LPartially feasible. Extend the existing
repeataction to evaluate conditions before/after each iteration. Critical safety: hard cap at 100 iterations (matching existingrepeatcap), mandatory max iteration parameter, and loop guard protection. If the loop body contains delays, each iteration needs the save - state/resume pattern, making implementation extremely complex. Recommend supporting synchronous loops only (no delays in body) initially.Implementation plan:
- Add
repeat_whileandrepeat_untilaction types. - Evaluate condition via
evaluateCondition()each iteration. - Enforce mandatory
maxIterationscap (≤100). - Phase 1: synchronous loops only (no delay actions in body).
- Phase 2 (future): delay - compatible loops with state persistence.
- Add
-
[ ] Rule - to - rule control —
Difficulty: 2 | Effort: MFeasible. Add
enable_rule,disable_rule, andtrigger_ruleaction types. Child calls parent, which looks up the target child and invokes existingenableRule()/disableRule()/executeRule(). To prevent cross - rule ping - pong loops, pass a "trigger chain depth" counter and refuse execution beyond depth 5.Implementation plan:
- Add
enable_rule,disable_rule,trigger_ruleaction types. - Implement
triggerChildRule(targetRuleId, depth)in the parent. - Add depth counter to
executeRule()to prevent cascading loops. - Validate target rule exists via
getChildAppById().
- Add
-
[ ] File write/append/delete —
Difficulty: 2 | Effort: SFeasible. The parent already has
uploadHubFile()/downloadHubFile()wrappers. New action typesfile_write,file_append,file_deletecall parent methods. Append does a read - modify - write cycle (not atomic). Requires Hub Admin Write gate. Variable substitution in content enables dynamic log files.Implementation plan:
- Add
file_write,file_append,file_deleteaction types. - Child calls
parent.writeFileFromRule(fileName, content, mode). - Validate filenames against
[A - Za - z0 - 9._-]pattern. - Apply Hub Admin Write gate for safety.
- Add
-
[ ] Music/siren control —
Difficulty: 2 | Effort: SFeasible. Convenience wrappers around existing
device_command. Hubitat hascapability.musicPlayer(play, pause, stop, setVolume, playTrack) andcapability.alarm(both, siren, strobe, off). The existingspeakaction demonstrates the pattern for TTS with volume. These would be ergonomic action types with built - in validation for the right capabilities.Implementation plan:
- Add
play_musicaction type with device, command, volume, track params. - Add
activate_sirenaction type with device, mode (siren/strobe/both/off). - Validate device has required capability before execution.
- Add
-
[x] Custom Action (any capability + command) —
Difficulty: 1 | Effort: SAlready implemented. The existing
device_commandaction type accepts any device ID, command, and parameters via dynamic invocation (device."${command}"(*params)). This is the "any capability + command" feature. -
[ ] Disable/Enable a device —
Difficulty: 1 | Effort: SFeasible (partially done). The
update_deviceMCP tool already supports theenabledproperty via the internal/device/disableendpoint. A newset_device_enabledrule action type wraps the same call. Requires Hub Admin Write. Should warn if the target device is used in active rule triggers.Implementation plan:
- Add
set_device_enabledaction type withdeviceIdandenabledboolean. - Call
parent.setDeviceEnabled(deviceId, enabled). - Check if device is used in any rule triggers and warn.
- Add
-
[ ] Ramp actions (continuous raise/lower) —
Difficulty: 3 | Effort: MPartially feasible. Same software - stepping pattern as fade dimmer/color temp. A generic
rampaction targets any numeric attribute. True continuous raise/lower (like holding a physical dimmer button) usesstartLevelChange(direction)/stopLevelChange()but can't be time - bounded from software. Shares therampValue()utility with fade actions.Implementation plan:
- Add
rampaction type with device, attribute, start, end, duration, steps. - Reuse
rampValue()utility from fade actions. - For devices with
startLevelChange/stopLevelChange, offer a hardware ramp option.
- Add
-
[ ] Ping IP address—Difficulty: 3 | Effort: MNot directly feasible. Hubitat's sandboxed Groovy environment does not provide ICMP,
HubAction, raw sockets, orRuntime.exec(). Only driver code can useHubActionfor certain protocols.Alternative: HTTP reachability check (added below as a replacement item)
-
[ ] HTTP reachability check (alternative to Ping) —
Difficulty: 2 | Effort: SFeasible. Use
httpGet()to make an HTTP request to the target IP and interpret success/failure as reachable/unreachable. Not a true ICMP ping, but achieves network reachability testing for devices with web servers. Another option: control a community driver that exposes ping functionality via the existingdevice_commandaction.Implementation plan:
- Add
http_checkaction type with target URL and timeout. - Use
httpGet()in a try - catch block. - Set result in a variable (reachable/unreachable) for use in conditions.
- Document as "HTTP reachability check" rather than "ping".
- Add
Variable System
-
[ ] Hub Variable Connectors (expose as device attributes) —
Difficulty: 4 | Effort: LPartially feasible. Hubitat's built - in Variable Connector feature (firmware ≥ 2.3.4) already handles hub variables. For MCP rule engine variables, exposing them as device attributes requires: (1) a custom virtual device driver, (2) the parent creating an instance via
addChildDevice(), (3) the parent updating attributes viasendEvent()on variable writes. The custom driver adds a third file to the project and install complexity.Implementation plan:
- Create
MCP Variable Connectordriver (new Groovy file). - Parent auto - creates a child device on first variable write (or on demand).
- Extend
setRuleVariable()to alsosendEvent()on the connector device. - Add driver to HPM package manifest.
- Document that hub variables should use Hubitat's built - in connectors instead.
- Create
-
[ ] Variable change events —
Difficulty: 3 | Effort: MFeasible. For MCP rule engine variables: extend
setRuleVariable()to firesendLocationEvent(name: "ruleVariableChanged", value: varName, data: newValue). Child rules with avariable_changetrigger subscribe to this event. For hub variables: use the polling approach from "Hub variable change triggers" above or leverage Variable Connectors.Implementation plan:
- Add
sendLocationEvent()call to the parent'ssetRuleVariable(). - Add
variable_changetrigger type to the child app. - Child subscribes to
location "ruleVariableChanged"event. - Filter by variable name in the handler.
- Add
-
[ ] Local variable triggers —
Difficulty: 2 | Effort: SFeasible. After
set_local_variableorvariable_mathmodifies a local variable, check for matchinglocal_variable_changetriggers and re - trigger asynchronously viarunIn(0, handler). High risk of infinite loops if a rule triggers itself — recommend only firing from external changes (another rule setting this rule's local variable via rule - to - rule control). The loop guard provides a safety net.Implementation plan:
- Add
local_variable_changetrigger type. - After local variable modification, schedule async re - evaluation.
- Add
triggerSourcetracking to prevent self - triggering loops. - Rely on loop guard as safety net.
- Add
Built - in Automation Equivalents
Philosophy: prefer native Hubitat apps. The MCP server was built to complement Hubitat, not replace it. These native apps (Room Lighting, Mode Manager, Button Controller, etc.) are well - maintained, have proper UIs, and are battle - tested. The MCP can already interact with the effects of these apps — it can read/set modes, control devices, trigger on device events, and see virtual devices they create.
The AI assistant is the wizard. Rather than building dedicated wizard tools that generate MCP rules to replicate what native apps already do, the AI can compose rules on the fly using existing
create_ruleand the full rule engine. Dedicated MCP tooling for these patterns is low priority and would only be implemented if the MCP genuinely cannot interact with the native app's functionality in some way. Each item will be reviewed on a case - by - case basis.
-
[ ] Room Lighting (room - centric lighting with vacancy mode) —
Low priorityNative app preferred. Hubitat's built - in Room Lighting app handles this well. The MCP can already control all the same devices, trigger on motion events, and use
if_then_else/delay/cancel_delayedto build equivalent logic viacreate_ruleif needed. No dedicated MCP tool required unless a gap is identified where MCP cannot interact with Room Lighting's behavior. -
[ ] Zone Motion Controller (multi - sensor zones) —
Low priorityNative app preferred. Hubitat's built - in Zone Motion Controller creates a virtual motion device that aggregates multiple sensors. If the user adds this virtual device to MCP's selected devices, MCP can already see and trigger on it. The AI can also replicate the logic using
create_virtual_device+create_rulewith multi - device triggers if needed. Only implement if MCP cannot adequately interact with the native app's output device. -
[ ] Mode Manager (automated mode changes) —
Low priorityNative app preferred. Hubitat's built - in Mode Manager handles time - based and presence - based mode changes. The MCP can already read/set modes via
get_modes/set_mode, trigger onmode_change, and build time/presence - triggered rules that callset_mode. No dedicated tool needed unless a specific interaction gap is found. -
[ ] Button Controller (streamlined button - to - action mapping) —
Low priorityNative app preferred. Hubitat's built - in Button Controller handles this natively. The MCP rule engine already has
button_eventtriggers with full support for button numbers (1–20) and action types (pushed/held/doubleTapped/released). The AI can create these rules directly viacreate_rule. No dedicated tool needed. -
[ ] Thermostat Scheduler (schedule - based setpoints) —
Low priorityNative app preferred. Hubitat's built - in Thermostat Scheduler handles schedule - based setpoints. The MCP rule engine already has
timetriggers,set_thermostatactions,modeanddays_of_weekconditions — the AI can compose schedule rules directly. No dedicated tool needed unless MCP cannot interact with the native scheduler's effects. -
[ ] Lock Code Manager —
Low priority — review neededMay warrant a dedicated tool. Hubitat's built - in Lock Code Manager handles code management via a UI. The MCP can already send lock code commands via
send_command(setCode,deleteCode) and readlockCodes/lastCodeNameattributes, so basic interaction is possible today. However, the native app's internal code inventory and temporary code scheduling are not directly accessible. A dedicated tool may add value for programmatic code management if the native app's outputs prove insufficient. Needs case - by - case review. -
[ ] Groups and Scenes (Zigbee group messaging)—Not feasibleNot feasible. The
zigbeeobject andsendHubCommand()withProtocol.ZIGBEEare only available in drivers, not apps. The MCP server is an app and cannot send raw Zigbee commands or manage Zigbee group IDs. Zigbee group management is handled by closed - source platform internals with no documented HTTP API endpoints.Alternatives already available:
- Leverage built - in Groups and Scenes app: Guide users to create Zigbee groups via the built - in app, then control the resulting group activator device through MCP's
send_command(group activator devices are regular switch/dimmer devices that MCP can already control) - Software - level group control: Create rules that send commands to multiple devices sequentially — already possible via multi - device rules or
device_commandactions - Scene capture/restore: The existing
capture_state/restore_stateactions provide scene - like functionality across multiple devices
- Leverage built - in Groups and Scenes app: Guide users to create Zigbee groups via the built - in app, then control the resulting group activator device through MCP's
HPM & App/Integration Management
-
[ ] Search HPM repositories by keyword —
Difficulty: 2 | Effort: SFeasible. HPM uses a public GraphQL API at
https://hubitatpackagemanager.azurewebsites.net/graphql. Asearch_hpm_packagestool sends a GraphQL query viahttpPost()and returns matching packages with name, description, author, and manifest URL. The master repository list athttps://raw.githubusercontent.com/HubitatCommunity/hubitat - packagerepositories/master/repositories.jsonprovides offline browsing.Implementation plan:
- Create
search_hpm_packagesMCP tool. - Send GraphQL
Searchquery to the Azure endpoint. - Parse and return results with pagination for large result sets.
- Cache results in
stateto reduce API calls.
- Create
-
[ ] Install/uninstall packages via HPM —
Difficulty: 4 | Effort: LPartially feasible. HPM has no programmatic API — it's purely UI - driven. Bypass approach: fetch the package manifest JSON, download each app/driver source, and install via existing
install_app/install_drivertools. However, packages installed this way won't appear in HPM's "Installed" list, creating a fragmented experience. Uninstall requires removing running app instances (not just code) via poorly documented/installedapp/endpoints.Implementation plan:
- Create
install_packageMCP tool using the bypass approach. - Fetch manifest → download sources → install via existing tools.
- Track installed packages in File Manager for update checking.
- Document the limitation: HPM won't know about these installations.
- For uninstall:
delete_app/delete_driverfor code, investigate/installedapp/disablefor instances.
- Create
-
[ ] Check for updates across installed packages —
Difficulty: 3 | Effort: MPartially feasible. For MCP - tracked packages (from the install tool above): fetch each manifest URL and compare versions — same pattern as the existing
checkForUpdate()for the MCP server itself. For HPM - managed packages: HPM's internal state is not accessible from another app. A parallel tracking database would be needed.Implementation plan:
- Create
check_package_updatesMCP tool. - Read MCP - tracked package list from File Manager.
- Fetch each manifest URL and compare version fields.
- Return list of packages with available updates.
- Handle fetch failures gracefully (GitHub rate limiting, network issues).
- Create
-
[ ] Search for official integrations not yet enabled —
Difficulty: 3 | Effort: MPartially feasible. No documented endpoint for enumerating available built - in apps. The
list_hub_appstool returns user - installed app types, not built - in ones. Practical approach: maintain a hardcoded catalog of known official integrations (Hue Bridge, Sonos, Alexa, Google Home, HomeKit, etc.) and check which ones have running instances. The list only changes with firmware updates.Implementation plan:
- Create
list_available_integrationsMCP tool. - Maintain hardcoded catalog of official integrations with descriptions.
- Check installed app instances to identify which are already enabled.
- Return available - but - not - enabled integrations with setup guidance.
- Update catalog with each MCP server release.
- Create
-
[ ] Discover community apps/drivers from GitHub, forums, etc. —
Difficulty: 3 | Effort: MPartially feasible. Primary mechanism: HPM repository search (above). GitHub API search (
https://api.github.com/search/repositories?q=hubitat+driver) works but is rate - limited to 10 req/min unauthenticated. The Hubitat community forum has no search API. A curated list in File Manager is a practical fallback.Implementation plan:
- Create
search_community_packagesMCP tool. - Primary: search HPM repositories via GraphQL.
- Secondary: optional GitHub API search with rate - limit handling.
- Return combined results with source attribution.
- Optionally maintain a curated popular - packages list in File Manager.
- Create
Dashboard Management
- [ ] Create, modify, delete dashboards programmatically —
Difficulty: 4 | Effort: LFeasible via internal HTTP endpoints (needs empirical testing). Hubitat's dashboard system uses a parent - child app pattern: "Hubitat Dashboard" is the parent, each individual dashboard is a child app. Deep research uncovered the
/installedapp/createchild/internal endpoint that the web UI uses.Key discoveries:
- Dashboard listing:
GET /dashboard/all?pinToken=<token>or viaGET /hub2/appsListfiltering for dashboard children - Dashboard creation:
GET /installedapp/createchild/hubitat/Dashboard/parent/{dashboardParentAppId}— creates a new child dashboard under the parent app. Returns a redirect to/installedapp/configure/{newChildId} - Dashboard layout read:
GET /apps/api/<parentAppId>/dashboard/<childAppId>/layout?access_token=<token> - Dashboard layout write:
POST /apps/api/<parentAppId>/dashboard/<childAppId>/layoutwith Bearer token auth - Dashboard deletion: Likely
POST /installedapp/configure/{childId}with remove action, orGET /installedapp/remove/{childId}(exact endpoint needs testing) - Child app type: namespace
hubitat, nameDashboard(confirmed from error messages in community forums)
Important caveats:
addChildApp()in Groovy cannot create dashboard children from the MCP app (parent mismatch), so the HTTP endpoint approach is required- The
createchildendpoint returns an HTTP redirect (302), not JSON — need to extract new child ID from the Location header - Post - creation configuration (dashboard name, authorized devices) requires a separate POST to
/installedapp/configure/{id}with form - encoded data - The Dashboard parent app must already be installed on the hub
- The
pinTokenfor/dashboard/allneeds to be obtained from the Dashboard parent app or may not be required for local API calls - Firmware ≥ 2.3.9 introduced "Easy Dashboard" as an alternative — its internal structure may differ
- All endpoints are undocumented and may change across firmware versions
Implementation plan:
- Discover Dashboard parent app ID via
GET /hub2/appsList(filter by app name). - Create
create_dashboardtool: callGET /installedapp/createchild/hubitat/Dashboard/parent/{parentId}, extract new child ID from redirect. - Configure new dashboard:
POST /installedapp/configure/{newId}with name and authorized devices. - Create
list_dashboardstool via/dashboard/allor/hub2/appsList. - Create
get_dashboard_layout/update_dashboard_layouttools for layout JSON read/write. - Create
delete_dashboardtool: test/installedapp/remove/{childId}endpoint. - Add Dashboard parent app ID and access token to MCP app preferences.
- Requires Hub Admin Write gate for safety.
- Phase 1: Implement list + read/modify layout (known - working endpoints).
- Phase 2: Implement create/delete (requires empirical testing on hub hardware).
- Dashboard listing:
Rule Machine Interoperability
Feasibility confirmed — creating/modifying RM rules is not possible (closed - source, undocumented format). However, controlling existing RM rules IS feasible via the
hubitat.helper.RMUtilsclass, which is available in the Hubitat app sandbox.
-
[ ] List all RM rules via
RMUtils.getRuleList()—Difficulty: 1 | Effort: SFeasible. Confirmed working.
RMUtils.getRuleList("5.0")returns RM 5.x rules;getRuleList()returns legacy rules. Returns a list suitable for enum options with rule IDs and names.Implementation plan:
- Add
import hubitat.helper.RMUtilsto the parent app. - Create
list_rm_rulesMCP tool. - Call both
getRuleList("5.0")andgetRuleList()for full coverage. - Handle the case where Rule Machine is not installed.
- Add
-
[ ] Enable/disable RM rules —
Difficulty: 2 | Effort: SFeasible. Uses
RMUtils.sendAction(ruleIds, "pauseRule"/"resumeRule", app.label, "5.0"). "Pause" is equivalent to "disable" in RM terminology.Implementation plan:
- Create
control_rm_ruleMCP tool withactionparameter. - Support actions:
pause(disable),resume(enable). - Validate rule ID exists via
getRuleList()first.
- Create
-
[ ] Trigger RM rule actions via
RMUtils.sendAction()—Difficulty: 2 | Effort: SFeasible. Supported actions:
"runRuleAct"(execute actions, skip conditions),"runRule"(evaluate conditions then run),"stopRuleAct"(cancel delayed/repeating actions). Note:"runRule"not applicable to Rule 4.x+.Implementation plan:
- Add
run_actions,evaluate,stop_actionsto thecontrol_rm_ruletool. - Map to RM action strings internally.
- Document which actions work with which RM versions.
- Add
-
[ ] Pause/resume RM rules —
Difficulty: 2 | Effort: SFeasible. Same mechanism as enable/disable above. Can be combined into the unified
control_rm_ruletool. -
[ ] Set RM Private Booleans —
Difficulty: 2 | Effort: SFeasible. Uses
RMUtils.sendAction(ruleIds, "setRuleBooleanTrue"/"setRuleBooleanFalse", app.label, "5.0"). Straightforward API.Implementation plan:
- Add
set_boolean_trueandset_boolean_falsetocontrol_rm_ruletool. - Accept rule ID and boolean value, map to appropriate sendAction call.
- Add
-
[x] Hub variable bridge for cross - engine coordination —
Difficulty: 2 | Effort: SAlready ~90% implemented. The existing
set_variable/get_variabletools work with Hubitat's global connector variables viagetGlobalConnectorVariable()/setGlobalConnectorVariable(). These are the same variables Rule Machine reads/writes. Variables set via MCP are immediately visible to RM and vice versa. To formalize: document the convention that shared variables should use hub connector variables.
Integration & Streaming
-
[ ] Event streaming / webhooks (real - time POST of device events) —
Difficulty: 3 | Effort: MFeasible. Subscribe to device events and
asynchttpPost()payloads to registered URLs. The rule engine already implementshttp_requestactions viahttpPost(). UseasynchttpPost(non - blocking) to avoid blocking the event queue during bursts. Rate limiting is important.Implementation plan:
- Create
configure_webhookMCP tool to register endpoint URLs and event filters. - Store webhook configs in
state.webhookSubscriptions. - Subscribe to relevant device events in
initialize(). - Event handler checks filters, formats payload, and POSTs asynchronously.
- Include rate limiting (configurable events per minute per webhook).
- Payload format:
{deviceId, label, attribute, value, timestamp, description}
- Create
-
[ ] MQTT client (bridge to Node - RED, Home Assistant, etc.)—Difficulty: 4 | Effort: LNot directly feasible from an app. Hubitat's
interfaces.mqttAPI is only available in drivers, not apps. The Groovy sandbox also doesn't allowjava.net.Socketor arbitrary Java imports for a custom MQTT implementation.Alternative: Companion driver approach (added below)
-
[ ] MQTT via companion driver (alternative to direct MQTT) —
Difficulty: 4 | Effort: LFeasible via workaround. Create a custom
MCP MQTT Bridge Driverthat usesinterfaces.mqttto connect to a broker. The MCP app creates this driver as a child device viaaddChildDevice(). Communication flows through device commands (app→driver:publish(topic, message)) and events (driver→app:sendEvent()+subscribe()). This adds a third Groovy file to the project.Implementation plan:
- Create
MCP MQTT Bridgedriver withinterfaces.mqtt. - Driver exposes commands:
connect,disconnect,publish,subscribe. - Driver fires events on incoming messages and connection status.
- Parent app creates driver instance via
addChildDevice(). - Add
mqtt_publish,mqtt_subscribe,mqtt_statusMCP tools. - Add driver to HPM package manifest.
Alternative (simpler): Use the existing
http_requestaction to bridge via HTTP - to - MQTT gateways (Node - RED HTTP - in nodes, HiveMQ REST API, EMQX REST API). - Create
Advanced Automation Patterns
These patterns don't require new MCP tools — the AI assistant can already compose them using existing
create_rule,set_variable,create_virtual_device, and other tools. They're documented here as reference patterns showing what's achievable today with the current rule engine. No dedicated wizard tools are planned unless a specific gap is identified.
-
[ ] Occupancy / room state machine —
No new tools neededAlready achievable. The AI can compose this using existing primitives: a hub variable
roomState_<room>holds state (vacant/occupied/engaged/checking).device_eventtriggers on motion/contact sensors feed intoif_then_elsechains withset_variableactions for state transitions. Duration - based triggers handle timeouts. Other rules check room state viavariableconditions. No dedicated tool required — the AI can build this pattern on request usingcreate_ruleandset_variable. -
[ ] Presence - based automation (first - to - arrive, last - to - leave) —
No new tools neededAlready achievable. The AI can compose this: a hub variable
homeCounttracks present people.device_eventtriggers on presence sensors increment/de
Alternatives








