概述
安装
内容详情
替代品
什么是Hubitat MCP Server?
Hubitat MCP Server是一个运行在Hubitat智能家居中枢上的应用程序,它实现了Model Context Protocol (MCP)协议,让AI助手(如Claude)能够通过自然语言与你的智能家居系统交互。你可以像与人对话一样控制设备、查询状态、创建自动化规则,无需编写复杂的代码或使用专门的应用程序。如何使用Hubitat MCP Server?
使用过程非常简单:1) 在Hubitat中枢上安装MCP服务器应用;2) 获取访问端点URL;3) 在AI客户端(如Claude Desktop或Claude.ai)中配置该URL;4) 开始用自然语言控制你的智能家居。整个过程无需额外的服务器或复杂的网络配置。适用场景
适合希望用自然语言控制智能家居的用户、需要快速创建复杂自动化规则的非技术用户、想要通过AI统一管理多个智能设备的家庭、以及需要远程访问和控制家居系统的场景。主要功能
如何使用
使用案例
常见问题
相关资源
安装
{
"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
Hubitat MCP Server 是一款原生的 模型上下文协议 (MCP) 服务器,可直接在 Hubitat Elevation 集线器上运行。与在其他机器上运行单独的 Node.js 服务器不同,它能在集线器本身原生运行,具备内置规则引擎和 69 个 MCP 工具(通过类别网关在 tools/list 中显示 30 个)。
测试版软件:本项目约 99% 由 Claude 生成(“氛围编码”)。这是一个正在进行中的项目,欢迎贡献代码和提交 错误报告!
🚀 快速开始
1. 添加应用
- 进入 应用 > + 添加用户应用 > MCP 规则服务器。
- 选择你希望通过 MCP 访问的设备。
- 点击 完成。
- 打开应用以查看端点 URL 并管理规则。
2. 获取端点 URL
应用会显示两个端点 URL:
- 本地端点 — 用于本地网络:
http://192.168.1.100/apps/api/123/mcp?access_token=YOUR_TOKEN
- 云端点 — 用于远程访问(需要 Hubitat 云订阅):
https://cloud.hubitat.com/api/YOUR_HUB_ID/apps/123/mcp?access_token=YOUR_TOKEN
3. 连接你的 AI 客户端
传输方式:此服务器使用 可流式 HTTP(非 SSE 或标准输入输出)。你的 MCP 客户端必须支持 HTTP 传输 — 大多数客户端默认支持。
Claude 代码(命令行界面)
添加到你的 MCP 设置文件(~/.claude.json 或项目 .mcp.json):
{
"mcpServers": {
"hubitat": {
"type": "url",
"url": "http://192.168.1.100/apps/api/123/mcp?access_token=YOUR_TOKEN"
}
}
}
如需远程访问,请使用 Hubitat 云 URL。
Claude 桌面版
添加到你的 Claude 桌面版配置文件:
- 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(连接器)
Claude.ai 通过 连接器 支持 MCP 服务器:
- 访问 claude.ai > 设置 > 连接器。
- 使用你的 Hubitat 端点 URL 添加新连接器。
- 如需远程访问,请使用 云端点 URL,或使用 Cloudflare 隧道 URL。
借助 Hubitat 云,你可以在任何地方通过 claude.ai 控制你的智能家居 — 无需本地设置!
其他 AI 服务
任何支持通过 HTTP URL 连接 MCP 服务器的 AI 服务都可以使用此服务器。可使用以下任意一种:
- Hubitat 云 URL — 拥有 Hubitat 云订阅无需额外设置。
- Cloudflare 隧道 — 用于免费的自托管远程访问(请参阅 远程访问选项)。
✨ 主要特性
MCP 工具(共 69 个 — tools/list 中显示 30 个)
服务器共有 69 个工具。为使 MCP 的 tools/list 更易于管理,21 个核心工具 始终可见,48 个额外工具 组织在 9 个域名网关 之后。AI 在 tools/list 中可看到 30 项(21 个核心工具 + 9 个网关)。每个网关的描述包含工具摘要(AI 始终可见),无参数调用网关可按需返回完整的参数模式。
核心工具(21 个) — 始终在 tools/list 中可见
设备(5 个) — 控制和查询设备
| 工具 | 描述 | |------|-------------| | `list_devices` | 列出可访问的设备(支持分页) | | `get_device` | 获取设备的完整详细信息:属性、命令、功能 | | `get_attribute` | 获取特定属性的值 | | `send_command` | 发送命令(开启、关闭、设置级别等) | | `get_device_events` | 获取设备的近期事件 |规则(4 个) — 创建和管理自动化规则
| 工具 | 描述 | |------|-------------| | `list_rules` | 列出所有规则及其状态 | | `get_rule` | 获取规则的完整详细信息(触发器、条件、动作) | | `create_rule` | 创建新的自动化规则 | | `update_rule` | 更新规则的触发器、条件、动作或启用状态(`enabled=true/false`) |设备管理(1 个)
| 工具 | 描述 | |------|-------------| | `update_device` | 更新设备属性(标签、房间、偏好设置等) |系统(5 个) — 集线器模式、HSM 和信息
| 工具 | 描述 | |------|-------------| | `get_hub_info` | 获取全面的集线器信息:硬件、健康状况、MCP 统计数据。个人身份信息(名称、IP、位置)需要集线器管理员读取权限 | | `get_modes` | 列出位置模式 | | `set_mode` | 更改位置模式(在家、外出、夜间等) | | `get_hsm_status` | 获取家庭安全监控状态 | | `set_hsm` | 更改 HSM 布防模式 |虚拟设备(2 个) — MCP 管理的虚拟设备
| 工具 | 描述 | |------|-------------| | `manage_virtual_device` | 创建或删除 MCP 管理的虚拟设备(`action`:“创建”,“删除”)(需要集线器管理员写入权限) | | `list_virtual_devices` | 列出 MCP 管理的虚拟设备及其状态 |集线器实用工具(3 个) — 备份、更新和诊断
| 工具 | 描述 | |------|-------------| | `create_hub_backup` | 创建完整的集线器备份(在进行管理员写入操作前需要) | | `check_for_update` | 检查是否有更新的 MCP 服务器版本可用 | | `generate_bug_report` | 生成全面的诊断报告 |参考(1 个)
| 工具 | 描述 | |------|-------------| | `get_tool_guide` | 获取 MCP 服务器本身的完整工具参考 |网关工具(9 个) — 每个网关代理多个工具
无参数调用网关可查看完整的参数模式。使用 tool='<name>' 和 args={...} 调用可执行特定工具。
manage_rules_admin(5 个) — 规则管理
| 工具 | 描述 | |------|-------------| | `delete_rule` | 永久删除规则(先自动备份) | | `test_rule` | 对规则进行预运行而不执行动作 | | `export_rule` | 将规则导出为 JSON 格式以便备份/共享 | | `import_rule` | 从导出的 JSON 导入规则 | | `clone_rule` | 克隆现有规则(初始状态为禁用) |manage_hub_variables(3 个) — 集线器变量
| 工具 | 描述 | |------|-------------| | `list_variables` | 列出所有集线器连接器和规则引擎变量 | | `get_variable` | 获取变量的值 | | `set_variable` | 设置变量的值(若不存在则创建) |manage_rooms(5 个) — 房间管理
| 工具 | 描述 | |------|-------------| | `list_rooms` | 列出所有房间的 ID、名称和设备数量 | | `get_room` | 获取房间的详细信息及分配的设备 | | `create_room` | 创建新房间(需要集线器管理员写入权限并确认) | | `delete_room` | 永久删除房间(需要集线器管理员写入权限并确认) | | `rename_room` | 重命名房间(需要集线器管理员写入权限并确认) |manage_destructive_hub_ops(3 个) — 破坏性集线器操作
| 工具 | 描述 | |------|-------------| | `reboot_hub` | 重启集线器(停机 1 - 3 分钟) | | `shutdown_hub` | 关闭集线器电源(需要物理重启) | | `delete_device` | 永久删除任何设备(**不可撤销**) |所有操作都会造成干扰。集线器管理员工具需要在设置中启用集线器管理员读取/写入权限。写入工具实施 三层安全网关:启用集线器管理员写入权限 + 24 小时内有完整的集线器备份 + 明确的 confirm=true。
manage_apps_drivers(6 个) — 应用/驱动程序列表、源代码和备份(只读)
| 工具 | 描述 | |------|-------------| | `list_hub_apps` | 列出集线器上安装的所有应用 | | `list_hub_drivers` | 列出集线器上安装的所有驱动程序 | | `get_app_source` | 获取应用的 Groovy 源代码 | | `get_driver_source` | 获取驱动程序的 Groovy 源代码 | | `list_item_backups` | 列出自动创建的源代码备份 | | `get_item_backup` | 从备份中获取源代码 |manage_app_driver_code(7 个) — 安装、更新、删除应用/驱动程序并恢复备份
| 工具 | 描述 | |------|-------------| | `install_app` | 从 Groovy 源代码安装新应用 | | `install_driver` | 从 Groovy 源代码安装新驱动程序 | | `update_app_code` | 修改现有应用代码 | | `update_driver_code` | 修改现有驱动程序代码 | | `delete_app` | 永久删除应用(自动备份) | | `delete_driver` | 永久删除驱动程序(自动备份) | | `restore_item_backup` | 将应用/驱动程序恢复到备份版本 |在进行任何修改/删除操作之前,源代码会自动备份。
manage_logs(6 个) — 日志和日志配置
| 工具 | 描述 | |------|-------------| | `get_hub_logs` | 获取集线器日志条目,支持按级别/来源过滤 | | `get_device_history` | 获取最多 7 天的设备事件历史记录 | | `get_debug_logs` | 获取 MCP 调试日志条目 | | `clear_debug_logs` | 清除所有 MCP 调试日志 | | `set_log_level` | 设置 MCP 日志级别(调试/信息/警告/错误) | | `get_logging_status` | 获取日志系统状态和容量 |监控工具需要启用集线器管理员读取权限。
manage_diagnostics(9 个) — 诊断、性能、无线电详细信息和状态捕获
| 工具 | 描述 | |------|-------------| | `get_set_hub_metrics` | 记录/检索集线器指标,并提供 CSV 趋势历史记录 | | `device_health_check` | 查找无响应/离线设备 | | `get_rule_diagnostics` | 获取特定规则的全面诊断信息 | | `get_zwave_details` | 获取 Z-Wave 无线电信息(固件、设备) | | `get_zigbee_details` | 获取 Zigbee 无线电信息(通道、PAN ID、设备) | | `zwave_repair` | 修复 Z-Wave 网络(5 - 30 分钟) | | `list_captured_states` | 列出保存的设备状态快照 | | `delete_captured_state` | 删除特定的状态快照 | | `clear_captured_states` | 删除所有状态快照 |manage_files(4 个) — 集线器文件管理器
| 工具 | 描述 | |------|-------------| | `list_files` | 列出文件管理器中的所有文件 | | `read_file` | 读取文件内容 | | `write_file` | 创建或更新文件(自动备份现有文件) | | `delete_file` | 删除文件(先自动备份) |写入/删除操作需要集线器管理员写入权限并确认。
规则引擎
通过自然语言创建自动化规则 — AI 会将你的请求转换为包含触发器、条件和动作的规则。你也可以通过 Hubitat 网页界面管理规则。
支持的触发器(6 种类型)
| 类型 | 描述 | |------|-------------| | `device_event` | 当设备属性发生变化时(可选持续时间以进行去抖动) | | `button_event` | 按钮按下、按住、双击或释放 | | `time` | 在特定时间,或相对于日出/日落有偏移 | | `periodic` | 按间隔重复(分钟、小时或天) | | `mode_change` | 当集线器模式发生变化时 | | `hsm_change` | 当 HSM 状态发生变化时 |支持的条件(14 种类型)
| 类型 | 描述 | |------|-------------| | `device_state` | 检查当前设备属性值 | | `device_was` | 设备处于某种状态达 X 秒(防循环) | | `time_range` | 在时间窗口内(支持日出/日落) | | `mode` | 当前集线器模式 | | `variable` | 集线器或规则局部变量的值 | | `days_of_week` | 特定的星期几 | | `sun_position` | 太阳在地平线之上或之下 | | `hsm_status` | 当前 HSM 布防状态 | | `presence` | 存在传感器状态 | | `lock` | 锁的状态 | | `thermostat_mode` | 恒温器运行模式 | | `thermostat_state` | 恒温器运行状态 | | `illuminance` | 光照水平(勒克斯)并进行比较 | | `power` | 功耗(瓦)并进行比较 |支持的动作(29 种类型)
| 类型 | 描述 | |------|-------------| | `device_command` | 向设备发送命令 | | `toggle_device` | 切换设备的开启/关闭状态 | | `activate_scene` | 激活场景设备 | | `set_level` | 设置调光器级别,可选持续时间 | | `set_color` | 设置 RGB 设备的颜色 | | `set_color_temperature` | 设置颜色温度 | | `lock` / `unlock` | 锁定或解锁设备 | | `set_variable` | 设置全局变量 | | `set_local_variable` | 设置规则范围内的变量 | | `set_mode` | 更改集线器模式 | | `set_hsm` | 更改 HSM 布防模式 | | `delay` | 在执行下一个动作前等待(可选 ID 以取消) | | `if_then_else` | 条件分支 | | `cancel_delayed` | 取消待执行的延迟动作 | | `repeat` | 重复执行动作 N 次 | | `stop` | 停止规则执行 | | `log` | 写入 Hubitat 日志 | | `capture_state` / `restore_state` | 保存和恢复设备状态 | | `send_notification` | 推送通知 | | `set_thermostat` | 设置恒温器模式、设定点、风扇模式 | | `http_request` | HTTP GET/POST(Webhook、外部 API) | | `speak` | 文本转语音,可选音量 | | `comment` | 仅用于文档记录(无操作) | | `set_valve` | 打开或关闭阀门 | | `set_fan_speed` | 设置风扇速度 | | `set_shade` | 打开、关闭或调整百叶窗位置 | | `variable_math` | 对变量进行算术运算 |规则示例
运动激活灯光:
{
"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" }
]
}
带去抖动的温度控制:
{
"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" }
]
}
带局部变量的按钮状态机:
{
"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" }
]
}
]
}
📦 安装指南
选项 A:Hubitat 包管理器(推荐)
如果你还没有安装 Hubitat 包管理器(HPM),请先按照 HPM 安装说明 进行设置。
安装 HPM 后:
- 打开 HPM > 安装。
- 搜索 “MCP”。
- 选择 MCP 规则服务器 并安装。
就这么简单!HPM 将自动安装父应用和子应用,并在有更新时通知你。
HPM 替代方法:你也可以使用 HPM > 安装 > 从 URL 安装 并粘贴:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/packageManifest.json
选项 B:手动安装
你需要安装 两个 应用文件:
1. 安装父应用(MCP 规则服务器):
- 访问 Hubitat 网页界面 > 应用代码 > + 新建应用。
- 点击 导入 并粘贴此 URL:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/hubitat-mcp-server.groovy
- 点击 导入 > 确定 > 保存。
- 点击 OAuth > 在应用中启用 OAuth > 保存。
2. 安装子应用(MCP 规则):
- 访问 应用代码 > + 新建应用。
- 点击 导入 并粘贴此 URL:
https://raw.githubusercontent.com/kingpanther13/Hubitat-local-MCP-server/main/hubitat-mcp-rule.groovy
- 点击 导入 > 确定 > 保存。
- (子应用无需 OAuth)
📚 详细文档
集线器管理员工具
集线器管理员读取和写入访问权限 默认禁用,必须在应用设置中明确启用。
启用集线器管理员工具
1. 在 Hubitat 网页界面中打开 **应用** > **MCP 规则服务器**。 2. 在 **集线器管理员访问** 下切换: - **启用集线器管理员读取工具** — 用于只读的集线器信息。 - **启用集线器管理员写入工具** — 用于备份、重启、关闭、Z-Wave 修复和应用/驱动程序管理。 3. 如果你的集线器启用了 **集线器安全**,还需配置: - **集线器安全用户名** 和 **密码** 在集线器安全部分。安全网关
所有集线器管理员写入工具实施 **三层安全网关**: 1. 必须在设置中 **启用** 集线器管理员写入权限。 2. AI 必须明确传递 `confirm=true`。 3. 必须在过去 24 小时内存在完整的集线器 **备份**(自动强制执行)。此外,修改或删除现有应用/驱动程序的工具会在进行更改之前自动备份项目的源代码。
项目备份与恢复
当你使用 `update_app_code`、`update_driver_code`、`delete_app` 或 `delete_driver` 时,服务器会在进行更改之前自动保存 **原始源代码**。 - 备份文件以 `.groovy` 文件形式存储在集线器的本地 **文件管理器** 中。 - 文件名为 `mcp-backup-app-通过 MCP 恢复:
- 使用
list_item_backups查看可用的备份。 - 使用
restore_item_backup并提供备份密钥和confirm=true。
手动恢复(不使用 MCP):
- 访问 Hubitat 网页界面 > 设置 > 文件管理器。
- 下载备份文件(例如,
mcp-backup-app-123.groovy)。 - 访问 应用代码(或 驱动程序代码)> 选择应用 > 粘贴源代码 > 保存。
集线器安全支持
如果你的集线器启用了集线器安全(网页界面需要登录),MCP 服务器会自动处理身份验证: - 在应用设置中配置你的集线器安全用户名和密码。 - 服务器会缓存会话 cookie 30 分钟。 - 过期的 cookie 会自动清除并重新进行身份验证。 - 如果未启用集线器安全,则无需凭据。性能与限制
集线器硬件推荐
| 集线器型号 | 推荐用途 | |-----------|----------------| | **C-7** | 适用于基本使用,处理大型设备列表或复杂规则时可能较慢 | | **C-8** | 适合大多数用户 | | **C-8 Pro** | 最适合大量使用、大量设备(100 个以上)或复杂自动化场景 |已知限制
- **`list_devices` 且 `detailed=true`** — 在 50 个以上设备时可能较慢。使用分页:`list_devices(detailed=true, limit=25, offset=0)`。 - **持续时间触发器** — 最大为 2 小时(7200 秒)。 - **捕获状态** — 默认限制为 20 个(可在设置中配置为 1 - 100 个)。 - **Hubitat 云响应** — 最大为 128KB(AWS MQTT 限制)。对于大型设备列表,使用分页。 - 无实时事件流(仅 MCP 响应)。 - 日出/日落时间每天重新计算。故障排除
设备未找到
确保设备已在应用的“选择 MCP 访问设备”设置中被选中。OAuth 令牌无效
1. 打开应用代码 > MCP 规则服务器。 2. 点击 OAuth > 在应用中启用 OAuth。 3. 保存。 4. 重新在应用中打开以获取新令牌。规则未触发
- 检查应用设置中的“启用规则引擎”是否已开启。 - 启用“调试日志记录”并检查 Hubitat 日志。 - 验证触发设备是否已选择用于 MCP 访问。 - 对于基于持续时间的触发器,确保条件在整个持续时间内保持为真。按钮事件无效
- 确保你使用的是 `button_event` 触发器类型(而非 `device_event`)。 - 验证按钮动作类型:`pushed`、`held`、`doubleTapped` 或 `released`。list_devices(detailed=true) 通过 Hubitat 云失败
Hubitat 云有 **128KB 响应大小限制**(AWS MQTT 限制)。使用分页: ``` list_devices(detailed=true, limit=25, offset=0) // 前 25 个设备 list_devices(detailed=true, limit=25, offset=25) // 接下来的 25 个设备 ``` 响应中包含 `total`、`hasMore` 和 `nextOffset` 以帮助分页。v0.0.x 版本的规则未显示
0.1.0 版本使用了新的父/子架构。存储在 `state.rules` 中的旧规则不会自动迁移。你需要通过 UI 或 MCP 重新创建规则。报告错误
为了更方便地报告错误: 1. 设置调试日志级别:设置 > MCP 调试日志级别 > “调试”,或让你的 AI 使用 `set_log_level` 设置为 “调试”。 2. 重现问题。 3. 让你的 AI 使用 `generate_bug_report` 工具 — 它将收集诊断信息并格式化一个可直接提交的报告。 4. 在 [GitHub 问题](https://github.com/kingpanther13/Hubitat-local-MCP-server/issues) 中提交报告。未来计划
未来计划
展望性想法 — 以下所有内容均为推测,需要进一步研究以确定可行性。这些功能均不保证或承诺实现。
状态标识:
[ ]= 未开始 |[~]= 进行中 / 部分完成 |[x]= 已完成 |[?]= 需要研究 / 可行性未知2025 年 2 月进行了可行性研究。每个项目现在都包含难度评级(1 - 5)、工作量估计和基于全面代码库分析的实施说明。
难度标识:
1= 简单 |2= 直接 |3= 中等 |4= 复杂 |5= 极其复杂工作量标识:
S= 小(小时) |M= 中(1 - 3 天) |L= 大(4 天以上)
规则引擎增强
触发器增强
-
[x] 条件触发器(在触发时评估) —
难度:1 | 工作量:S已实现。
evaluateTriggerCondition()方法使用完整的条件系统评估每个触发器的condition字段。每个触发器处理程序已经调用此方法。可能需要更好的文档和 MCP 工具模式更新,以使该功能更易于发现。 -
[x] Cron/周期性触发器 —
难度:1 | 工作量:S已实现。
periodic触发器类型通过schedule()内部生成 cron 表达式。要暴露原始 cron 支持,添加一个cron子类型,直接传递用户提供的 cron 表达式。Hubitat 接受标准的 7 字段 cron 表达式。用户提供的字符串需要验证。 -
[ ] 端点/Webhook 触发器 —
难度:3 | 工作量:M可行。在父应用的
mappings块中添加一个单一的调度端点(例如,/mcp/webhook?ruleKey=<key>)。父应用通过键查找子规则,并使用请求体/参数作为事件数据调用executeRule("webhook", webhookEvt)。由于mappings是编译时的,因此无法实现每个规则的动态路径,但带有查询参数的共享端点可以工作。OAuth 访问令牌已经保护了路径。实施计划:
- 在父应用中添加
GET/POST /webhook映射。 - 在子应用的
subscribeToTriggers()中添加webhook触发器类型。 - 父应用通过键查找将请求调度到匹配的子规则。
- 将请求体、头和查询参数打包成伪事件,用于变量替换。
- 在父应用中添加
-
[ ] 集线器变量更改触发器 —
难度:3 | 工作量:M部分可行。Hubitat 没有为集线器变量更改提供原生的
subscribe()方法。有两种方法:(A) 轮询 — 使用schedule()每 5 - 10 秒比较当前值与atomicState中的最后已知值。这会增加延迟和集线器负载。(B) 变量连接器解决方法 — Hubitat 的变量连接器功能(固件 ≥ 2.3.4)将集线器变量暴露为设备属性,可以通过现有的device_event触发器进行订阅。选项 B 更简洁,但需要用户创建变量连接器设备。实施计划:
- 添加
variable_change触发器类型,可配置轮询间隔。 - 在
atomicState.variableSnapshots中存储最后已知值。 - 在每个轮询周期中,比较并在值更改时触发规则。
- 将变量连接器方法记录为首选替代方案。
- 添加
-
[ ] 系统启动触发器 —
难度:2 | 工作量:S可行。Hubitat 支持
subscribe(location, "systemStart", handler)。添加一个system_start触发器类型。集线器重启后,应用恢复,initialize()→subscribeToTriggers()运行,系统启动事件触发规则。小边缘情况:事件可能在所有应用完成恢复之前触发 — 需要在硬件上进行测试。实施计划:
- 在子应用中添加
system_start触发器类型。 - 在
subscribeToTriggers()中订阅location "systemStart"事件。 - 处理程序调用
executeRule("system_start")。
- 在子应用中添加
-
[ ] 日期范围触发器 —
难度:2 | 工作量:S可行。作为条件实现比作为触发器更好。
date_range条件类型使用new Date()检查开始/结束日期,遵循与time_range和days_of_week相同的模式。如果作为触发器实现,使用schedule()在范围开始时触发。java.util.Calendar在沙箱中可用。实施计划:
- 在
evaluateCondition()中添加date_range条件类型。 - 接受
startDate和endDate(ISO 格式)。 - 可选地添加一个
date_range触发器,在范围开始时调度一次性事件。
- 在
条件增强
-
[ ] 必需表达式(规则门)与飞行中动作取消 —
难度:4 | 工作量:L可行但复杂。“门”是在动作执行期间持续监控的条件。如果条件变为假,则取消飞行中的延迟动作。现有的
cancelledDelayIds机制为取消提供了基础。门需要为相关设备单独进行subscribe()调用,处理程序检查门条件并将所有待处理的延迟 ID 标记为取消。这是最具架构复杂性的增强 — 它需要在延迟动作链期间进行异步监控和仔细的状态管理。实施计划:
- 在规则结构中添加
requiredExpressions数组,与conditions并列。 - 单独订阅与门相关的设备事件。
- 门处理程序评估条件,如果为假则取消所有活动延迟。
- 在
atomicState.activeDelayIds中跟踪每个规则的所有活动延迟 ID。 - 在规则正常执行完成时添加清理逻辑。
- 在规则结构中添加
-
[ ] 完整布尔表达式构建器(AND/OR/XOR/NOT 嵌套) —
难度:4 | 工作量:L可行。用递归树结构替换扁平的条件数组 +
conditionLogic切换:{operator: "AND", operands: [...]}。将evaluateConditions()重写为树遍历器。NOT 包装单个操作数;XOR 检查恰好一个为真。现有的evaluateCondition()用于叶节点已经模块化。主要挑战是 MCP 工具的易用性和向后兼容性 — 扁平数组格式需要迁移逻辑。实施计划:
- 定义具有
operator和operands字段的树数据结构。 - 实现递归的
evaluateConditionTree()方法。 - 支持旧的扁平格式和新的树格式(迁移路径)。
- 更新
create_rule/update_rule工具模式。 - 更新
describeCondition()以进行递归格式化。
- 定义具有
-
[ ] 每个规则的私有布尔值 —
难度:2 | 工作量:S可行。已经可以通过
atomicState.localVariables实现。添加一个专用的set_rule_boolean动作类型,调用parent.setRuleBooleanOnChild(targetRuleId, boolName, value),该方法更新目标子规则的局部变量。添加一个rule_boolean条件类型,读取特定规则的局部变量。父应用通过getChildAppById()调解跨规则访问。实施计划:
- 在子应用中添加
set_rule_boolean动作类型。 - 在
evaluateCondition()中添加rule_boolean条件类型。 - 在父应用中添加
setRuleBooleanOnChild()方法。 - 更新 MCP 工具模式。
- 在子应用中添加
动作增强
-
[ ] 随时间渐变调光器 —
难度:3 | 工作量:M可行。许多调光器原生支持
setLevel(level, duration),代码库已经使用了该功能。对于软件渐变:计算步长和间隔,然后使用runIn()进行增量步骤。示例:在 60 秒内从 0 到 100 = 每 3 秒 5%(20 步)。将步数限制在 ~20 - 30,以避免过度占用集线器的调度器。与色温渐变和斜坡动作共享步进实用程序。实施计划:
- 添加
fade_dimmer动作类型,包含startLevel、endLevel、durationSeconds。 - 实现
rampValue()实用程序,用于步进runIn()调度。 - 在
runIn()上使用[overwrite: false]以避免冲突回调。 - 当设备支持时,回退到原生
setLevel(level, duration)。
- 添加
-
[ ] 随时间改变色温 —
难度:3 | 工作量:M可行。与渐变调光器模式相同。使用共享的
rampValue()实用程序,在每个步骤调用setColorTemperature()。一些设备原生支持setColorTemperature(temp, level, duration)。温度范围因设备而异(通常为 2000K - 6500K)。实施计划:
- 添加
fade_color_temperature动作类型,包含startTemp、endTemp、durationSeconds。 - 重用渐变调光器的
rampValue()实用程序。 - 处理温度步骤的整数舍入。
- 添加
-
[ ] 按模式执行动作 —
难度:2 | 工作量:S可行。添加一个
per_mode动作类型,包含一个模式名称到动作列表的映射。在执行时,检查location.mode并执行匹配的动作列表。结构上类似于if_then_else,但有多个分支。现有的if_then_else与mode条件已经提供了此功能,但不够方便。实施计划:
- 添加
per_mode动作类型,包含modeActions映射。 - 在执行时查找
location.mode。 - 使用现有的
executeAction()基础设施执行匹配的动作列表。
- 添加
-
[ ] 等待事件 / 等待表达式 —
难度:5 | 工作量:L部分可行。需要在执行流中暂停,直到外部事件发生。在 Hubitat 的单线程模型中,没有阻塞等待。实现方法:将当前执行状态(动作索引、上下文)保存到
atomicState,订阅目标事件,从执行中返回,然后在事件触发时恢复 — 类似于delay模式,但由事件触发。必须设置超时。等待订阅和其他触发器之间可能存在竞争条件。实施计划:
- 添加
wait_for_event动作类型,包含目标设备/属性和强制超时。 - 将执行状态保存到
atomicState(与delay模式相同)。 - 为目标事件创建临时订阅。
- 在事件触发或超时后,从保存的状态恢复执行。
- 恢复后清理订阅。
- 添加
-
[ ] 重复直到 / 重复当 —
难度:4 | 工作量:L部分可行。扩展现有的
repeat动作,在每次迭代之前/之后评估条件。关键安全措施:硬限制为 100 次迭代(与现有repeat限制匹配),强制最大迭代参数,以及循环保护。如果循环体包含延迟,每次迭代都需要保存状态/恢复模式,这使得实现极其复杂。建议最初仅支持同步循环(循环体中无延迟)。实施计划:
- 添加
repeat_while和repeat_until动作类型。 - 每次迭代通过
evaluateCondition()评估条件。 - 强制
maxIterations上限(≤100)。 - 阶段 1:仅支持同步循环(循环体中无延迟动作)。
- 阶段 2(未来):支持包含延迟的循环,具有状态持久化。
- 添加
-
[ ] 规则间控制 —
难度:2 | 工作量:M可行。添加
enable_rule、disable_rule和trigger_rule动作类型。子应用调用父应用,父应用查找目标子规则并调用现有的enableRule()/disableRule()/executeRule()。为防止规则间的乒乓循环,传递一个“触发链深度”计数器,并拒绝深度超过 5 的执行。实施计划:
- 添加
enable_rule、disable_rule、trigger_rule动作类型。 - 在父应用中实现
triggerChildRule(targetRuleId, depth)。 - 在
executeRule()中添加深度计数器,以防止级联循环。 - 通过
getChildAppById()验证目标规则是否存在。
- 添加
-
[ ] 文件写入/追加/删除 —
难度:2 | 工作量:S可行。父应用已经有
uploadHubFile()/downloadHubFile()包装器。新的动作类型file_write、file_append、file_delete调用父应用方法。追加操作进行读-修改-写循环(非原子操作)。需要集线器管理员写入权限。内容中的变量替换支持动态日志文件。实施计划:
- 添加
file_write、file_append、file_delete动作类型。 - 子应用调用
parent.writeFileFromRule(fileName, content, mode)。 - 根据
[A-Za-z0-9._-]模式验证文件名。 - 应用集线器管理员写入权限以确保安全。
- 添加
-
[ ] 音乐/警报控制 —
难度:2 | 工作量:S可行。围绕现有的
device_command提供便利包装。Hubitat 有capability.musicPlayer(播放、暂停、停止、设置音量、播放曲目)和capability.alarm(两者、警报器、频闪灯、关闭)。现有的speak动作展示了带有音量的文本转语音模式。这些将是具有内置功能验证的便捷动作类型。实施计划:
- 添加
play_music动作类型,包含设备、命令、音量、曲目参数。 - 添加
activate_siren动作类型,包含设备、模式(警报器/频闪灯/两者/关闭)。 - 在执行前验证设备是否具有所需功能。
- 添加
-
[x] 自定义动作(任何功能 + 命令) —
难度:1 | 工作量:S已实现。现有的
device_command动作类型通过动态调用(device."${command}"(*params))接受任何设备 ID、命令和参数。这就是“任何功能 + 命令”功能。 -
[ ] 禁用/启用设备 —
难度:1 | 工作量:S可行(部分完成)。
update_deviceMCP 工具已经通过内部/device/disable端点支持enabled属性。一个新的set_device_enabled规则动作类型包装相同的调用。需要集线器管理员写入权限。如果目标设备用于活动规则触发器,应发出警告。实施计划:
- 添加
set_device_enabled动作类型,包含deviceId和enabled布尔值。 - 调用
parent.setDeviceEnabled(deviceId, enabled)。 - 检查设备是否用于任何规则触发器并发出警告。
- 添加
-
[ ] 斜坡动作(连续升高/降低) —
难度:3 | 工作量:M部分可行。与渐变调光器/色温模式相同的软件步进模式。通用的
ramp动作针对任何数字属性。真正的连续升高/降低(如按住物理调光器按钮)使用startLevelChange(direction)/stopLevelChange(),但无法从软件进行时间限制。与渐变动作共享rampValue()实用程序。实施计划:
- 添加
ramp动作类型,包含设备、属性、起始值、结束值、持续时间、步数。 - 重用渐变动作的
rampValue()实用程序。 - 对于具有
startLevelChange/stopLevelChange的设备,提供硬件斜坡选项。
- 添加
-
[ ] Ping IP 地址—难度:3 | 工作量:M不可行。Hubitat 的沙箱 Groovy 环境不提供 ICMP、
HubAction、原始套接字或Runtime.exec()。只有驱动程序代码可以使用HubAction进行某些协议。替代方案:HTTP 可达性检查 (下面添加为替代项)
-
[ ] HTTP 可达性检查 (替代 Ping) —
难度:2 | 工作量:S可行。使用
httpGet()向目标 IP 发送 HTTP 请求,并将成功/失败解释为可达/不可达。这不是真正的 ICMP ping,但可以实现对具有 Web 服务器的设备的网络可达性测试。另一个选项:控制一个社区驱动程序,通过现有的device_command动作暴露 ping 功能。实施计划:
- 添加
http_check动作类型,包含目标 URL 和超时。 - 在 try-catch 块中使用
httpGet()。 - 将结果设置在一个变量中(可达/不可达),用于条件判断。
- 文档中说明为“HTTP 可达性检查”而非“ping”。
- 添加
变量系统
-
[ ] 集线器变量连接器(作为设备属性暴露) —
难度:4 | 工作量:L部分可行。Hubitat 的内置变量连接器功能(固件 ≥ 2.3.4)已经处理集线器变量。对于 MCP 规则引擎变量,将它们作为设备属性暴露需要:(1) 一个自定义虚拟设备驱动程序,(2) 父应用通过
addChildDevice()创建一个实例,(3) 父应用在变量写入时通过sendEvent()更新属性。自定义驱动程序会为项目增加第三个文件和安装复杂性。实施计划:
- 创建
MCP 变量连接器驱动程序(新的 Groovy 文件)。 - 父应用在首次写入变量时(或按需)自动创建一个子设备。
- 扩展
setRuleVariable()以在连接器设备上也调用sendEvent()。 - 将驱动程序添加到 HPM 包清单中。
- 文档中说明集线器变量应使用 Hubitat 的内置连接器。
- 创建
-
[ ] 变量更改事件 —
难度:3 | 工作量:M可行。对于 MCP 规则引擎变量:扩展
setRuleVariable()以触发sendLocationEvent(name: "ruleVariableChanged", value: varName, data: newValue)。带有variable_change触发器的子规则订阅此事件。对于集线器变量:使用上述“集线器变量更改触发器”中的轮询方法或利用变量连接器。实施计划:
- 在父应用的
setRuleVariable()中添加sendLocationEvent()调用。 - 在子应用中添加
variable_change触发器类型。 - 子应用订阅
location "ruleVariableChanged"事件。 - 在处理程序中按变量名称过滤。
- 在父应用的
-
[ ] 局部变量触发器 —
难度:2 | 工作量:S可行。在
set_local_variable或variable_math修改局部变量后,检查匹配的local_variable_change触发器,并通过runIn(0, handler)异步重新触发。如果规则触发自身,存在无限循环的高风险 — 建议仅在外部更改(另一个规则通过规则间控制设置此规则的局部变量)时触发。循环保护提供安全网。实施计划:
- 添加
local_variable_change触发器类型。 - 在局部变量修改后,调度异步重新评估。
- 添加
triggerSource跟踪,以防止自触发循环。 - 依赖循环保护作为安全网。
- 添加
内置自动化等效功能
理念:优先使用原生 Hubitat 应用。MCP 服务器旨在补充 Hubitat,而非替代它。这些原生应用(房间照明、模式管理器、按钮控制器等)维护良好,有合适的用户界面,并且经过了实战检验。MCP 已经可以与这些应用的 效果 进行交互 — 它可以读取/设置模式、控制设备、对设备事件进行触发,并查看它们创建的虚拟设备。
AI 助手是魔法师。与其构建专门的向导工具来生成 MCP 规则以复制原生应用已经实现的功能,AI 可以使用现有的
create_rule和完整的规则引擎即时编写规则。针对这些模式的专用 MCP 工具 优先级较低,只有在 MCP 确实无法以某种方式与原生应用的功能进行交互时才会实现。每个项目将根据具体情况进行评估。
-
[ ] 房间照明(以房间为中心的照明,带有空位模式) —
低优先级首选原生应用。Hubitat 的内置房间照明应用可以很好地处理此功能。MCP 已经可以控制相同的设备,对运动事件进行触发,并使用
if_then_else/delay/cancel_delayed通过create_rule构建等效逻辑(如果需要)。除非发现 MCP 无法与房间照明的行为进行交互的差距,否则不需要专用的 MCP 工具。 -
[ ] 区域运动控制器(多传感器区域) —
低优先级首选原生应用。Hubitat 的内置区域运动控制器创建一个虚拟运动设备,聚合多个传感器。如果用户将此虚拟设备添加到 MCP 的选定设备中,MCP 已经可以看到并对其进行触发。AI 也可以使用
create_virtual_device+create_rule结合多设备触发器复制此逻辑(如果需要)。只有在 MCP 无法与原生应用的输出设备进行充分交互时才进行实现。 -
[ ] 模式管理器(自动化模式更改) —
低优先级首选原生应用。Hubitat 的内置模式管理器处理基于时间和存在的模式更改。MCP 已经可以通过
get_modes/set_mode读取/设置模式,对mode_change进行触发,并构建基于时间/存在触发的规则来调用set_mode。除非发现特定的交互差距,否则不需要专用工具。 -
[ ] 按钮控制器(简化的按钮到动作映射) —
低优先级首选原生应用。Hubitat 的内置按钮控制器原生处理此功能。MCP 规则引擎已经有
button_event触发器,完全支持按钮编号(1 - 20)和动作类型(按下/按住/双击/释放)。AI 可以通过create_rule直接创建这些规则。不需要专用工具。 -
[ ] 恒温器调度器(基于时间表的设定点) —
低优先级首选原生应用。Hubitat 的内置恒温器调度器处理基于时间表的设定点。MCP 规则引擎已经有
time触发器、set_thermostat动作、mode和days_of_week条件 — AI 可以直接编写时间表规则。除非 MCP 无法与原生调度器的效果进行交互,否则不需要专用工具。 -
[ ] 锁码管理器 —
低优先级 — 需要评估可能需要专用工具。Hubitat 的内置锁码管理器通过用户界面处理代码管理。MCP 已经可以通过
send_command(setCode,deleteCode)发送锁码命令,并读取lockCodes/lastCodeName属性,因此目前可以进行基本交互。然而,原生应用的内部代码库存和临时代码调度无法直接访问。如果原生应用的输出证明不足,专用工具可能为程序化代码管理增加价值。需要具体情况具体评估。 -
[ ] 组和场景(Zigbee 组消息)—不可行不可行。
zigbee对象和sendHubCommand()与Protocol.ZIGBEE仅在驱动程序中可用,不在应用中。MCP 服务器是一个应用,无法发送原始 Zigbee 命令或管理 Zigbee 组 ID。Zigbee 组管理由闭源平台内部处理,没有文档化的 HTTP API 端点。已有替代方案:
- 利用内置的组和场景应用:指导用户通过内置应用创建 Zigbee 组,然后通过 MCP 的
send_command控制生成的组激活器设备(组激活器设备是 MCP 已经可以控制的常规开关/调光器设备) - 软件级组控制:创建规则,依次向多个设备发送命令 — 已经可以通过多设备规则或
device_command动作实现 - 场景捕获/恢复:现有的
capture_state/restore_state动作提供了跨多个设备的类似场景功能
- 利用内置的组和场景应用:指导用户通过内置应用创建 Zigbee 组,然后通过 MCP 的
HPM 与应用/集成管理
-
[ ] 按关键字搜索 HPM 存储库 —
难度:2 | 工作量:S可行。HPM 使用公共 GraphQL API
https://hubitatpackagemanager.azurewebsites.net/graphql。search_hpm_packages工具通过httpPost()发送 GraphQL 查询,并返回匹配的包,包含名称、描述、作者和清单 URL。主存储库列表https://raw.githubusercontent.com/HubitatCommunity/hubitat-packagerepositories/master/repositories.json提供离线浏览。实施计划:
- 创建
search_hpm_packagesMCP 工具。 - 向 Azure 端点发送 GraphQL
Search查询。 - 解析并返回结果,对大型结果集进行分页。
- 在
state中缓存结果,以减少 API 调用。
- 创建
-
[ ] 通过 HPM 安装/卸载包 —
难度:4 | 工作量:L部分可行。HPM 没有程序化 API — 它纯粹是基于用户界面的。绕过方法:获取包清单 JSON,下载每个应用/驱动程序源,并通过现有的
install_app/install_driver工具进行安装。然而,以这种方式安装的包不会出现在 HPM 的“已安装”列表中,会造成碎片化体验。卸载需要通过文档不完善的/installedapp/端点移除运行中的应用实例(不仅仅是代码)。实施计划:
- 使用绕过方法创建
install_packageMCP 工具。 - 获取清单 → 下载源 → 通过现有工具安装。
- 在文件管理器中跟踪已安装的包,以便进行更新检查。
- 文档中说明限制:HPM 不会知道这些安装。
- 对于卸载:使用
delete_app/delete_driver删除代码,研究/installedapp/disable用于实例。
- 使用绕过方法创建
-
[ ] 检查已安装包的更新 —
难度:3 | 工作量:M部分可行。对于 MCP 跟踪的包(来自上述安装工具):获取每个清单 URL 并比较版本 — 与现有的 MCP 服务器
checkForUpdate()模式相同。对于 HPM 管理的包:HPM 的内部状态无法从另一个应用访问。需要一个并行跟踪数据库。实施计划:
- 创建
check_package_updatesMCP 工具。 - 从文件管理器读取 MCP 跟踪的包列表。
- 获取每个清单 URL 并比较版本字段。
- 返回有可用更新的包列表。
- 优雅地处理获取失败(GitHub 速率限制、网络问题)。
- 创建
-
[ ] 搜索尚未启用的官方集成 —
难度:3 | 工作量:M部分可行。没有文档化的端点用于枚举可用的内置应用。
list_hub_apps工具返回用户安装的应用类型,而不是内置应用。实用方法:维护一个硬编码的已知官方集成目录(Hue Bridge、Sonos、Alexa、Google Home、HomeKit 等),并检查哪些有运行实例。列表仅在固件更新时更改。实施计划:
- 创建
list_available_integrationsMCP 工具。 - 维护硬编码的官方集成目录及其描述。
- 检查已安装的应用实例,以确定哪些已经启用。
- 返回可用但未启用的集成,并提供设置指南。
- 每次 MCP 服务器发布时更新目录。
- 创建
-
[ ] 从 GitHub、论坛等发现社区应用/驱动程序 —
难度:3 | 工作量:M部分可行。主要机制:上述的 HPM 存储库搜索。GitHub API 搜索 (
https://api.github.com/search/repositories?q=hubitat+driver) 可以工作,但未经身份验证的速率限制为每分钟 10 次请求。Hubitat 社区论坛没有搜索 API。文件管理器中的精选列表是一个实用的备用方案。实施计划:
- 创建
search_community_packagesMCP 工具。 - 主要:通过 GraphQL 搜索 HPM 存储库。
- 次要:可选的 GitHub API 搜索,处理速率限制。
- 返回合并结果,并注明来源。
- 可选地在文件管理器中维护一个精选的热门包列表。
- 创建
仪表盘管理
- [ ] 以编程方式创建、修改、删除仪表盘 —
难度:4 | 工作量:L通过内部 HTTP 端点可行(需要实证测试)。Hubitat 的仪表盘系统使用父 - 子应用模式:“Hubitat 仪表盘”是父应用,每个单独的仪表盘是子应用。深入研究发现了网页界面使用的
/installedapp/createchild/内部端点。关键发现:
- 仪表盘列表:
GET /dashboard/all?pinToken=<token>或通过GET /hub2/appsList过滤仪表盘子应用。 - 仪表盘创建:
GET /installedapp/createchild/hubitat/Dashboard/parent/{dashboardParentAppId}— 在父应用下创建一个新的子仪表盘。返回重定向到/installedapp/configure/{newChildId}。 - 仪表盘布局读取:
GET /apps/api/<parentAppId>/dashboard/<childAppId>/layout?access_token=<token>。 - 仪表盘布局写入:
POST /apps/api/<parentAppId>/dashboard/<childAppId>/layout,使用 Bearer 令牌身份验证。 - 仪表盘删除:可能是
POST /installedapp/configure/{childId}并执行删除操作,或GET /installedapp/remove/{childId}(确切端点需要测试)。 - 子应用类型:命名空间
hubitat,名称Dashboard(从社区论坛的错误消息中确认)。
重要注意事项:
- Groovy 中的
addChildApp()无法 从 MCP 应用创建仪表盘子应用(父应用不匹配),因此需要使用 HTTP 端点方法。 createchild端点返回 HTTP 重定向(302),而不是 JSON — 需要从 Location 头中提取新的子应用 ID。- 创建后的配置(仪表盘名称、授权设备)需要单独的 POST 请求到
/installedapp/configure/{id},使用表单编码数据。 - 仪表盘父应用必须已经安装在集线器上。
/dashboard/all的pinToken需要从仪表盘父应用获取,或者本地 API 调用可能不需要。- 固件 ≥ 2.3.9 引入了“简易仪表盘”作为替代方案 — 其内部结构可能不同。
- 所有端点均未文档化,可能会随固件版本变化。
实施计划:
- 通过
GET /hub2/appsList(按应用名称过滤)发现仪表盘父应用 ID。 - 创建
create_dashboard工具:调用GET /installedapp/createchild/hubitat/Dashboard/parent/{parentId},从重定向中提取新的子应用 ID。 - 配置新仪表盘:
POST /installedapp/configure/{newId},包含名称和授权设备。 - 创建
list_dashboards工具,通过/dashboard/all或/hub2/appsList。 - 创建
get_dashboard_layout/update_dashboard_layout工具,用于布局 JSON 的读取/写入。 - 创建
delete_dashboard工具:测试/installedapp/remove/{childId}端点。 - 将仪表盘父应用 ID 和访问令牌添加到 MCP 应用偏好设置中。
- 需要集线器管理员写入权限以确保安全。
- 阶段 1:实现列表 + 读取/修改布局(已知可用的端点)。
- 阶段 2:实现创建/删除(需要在集线器硬件上进行实证测试)。
- 仪表盘列表:
规则机器互操作性
可行性已确认 — 创建/修改 RM 规则不可行(闭源、未文档化格式)。然而,通过
hubitat.helper.RMUtils类控制现有 RM 规则是可行的,该类在 Hubitat 应用沙箱中可用。
-
[ ] 通过
RMUtils.getRuleList()列出所有 RM 规则 —难度:1 | 工作量:S可行。已确认可行。
RMUtils.getRuleList("5.0")返回 RM 5.x 规则;getRuleList()返回旧版规则。返回适合枚举选项的列表,包含规则 ID 和名称。实施计划:
- 在父应用中添加
import hubitat.helper.RMUtils。 - 创建
list_rm_rulesMCP 工具。 - 同时调用
getRuleList("5.0")和getRuleList()以覆盖所有规则。 - 处理规则机器未安装的情况。
- 在父应用中添加
-
[ ] 启用/禁用 RM 规则 —
难度:2 | 工作量:S可行。使用
RMUtils.sendAction(ruleIds, "pauseRule"/"resumeRule", app.label, "5.0")。“暂停”在 RM 术语中相当于“禁用”。实施计划:
- 创建
control_rm_ruleMCP 工具,包含action参数。 - 支持动作:
pause(禁用),resume(启用)。 - 首先通过
getRuleList()验证规则 ID 是否存在。
- 创建
-
[ ] 通过
RMUtils.sendAction()触发 RM 规则动作 —难度:2 | 工作量:S可行。支持的动作:
"runRuleAct"(执行动作,跳过条件),"runRule"(评估条件后运行),"stopRuleAct"(取消延迟/重复动作)。注意:"runRule"不适用于规则 4.x+。实施计划:
- 在
control_rm_rule工具中添加run_actions、evaluate、stop_actions。 - 内部映射到 RM 动作字符串。
- 文档中说明哪些动作适用于哪些 RM 版本。
- 在
-
[ ] 暂停/恢复 RM 规则 —
难度:2 | 工作量:S可行。与启用/禁用机制相同。可以合并到统一的
control_rm_rule工具中。 -
[ ] 设置 RM 私有布尔值 —
难度:2 | 工作量:S可行。使用
RMUtils.sendAction(ruleIds, "setRuleBooleanTrue"/"setRuleBooleanFalse", app.label, "5.0")。简单的 API。实施计划:
- 在
control_rm_rule工具中添加set_boolean_true和set_boolean_false。 - 接受规则 ID 和布尔值,映射到适当的
sendAction调用。
- 在
-
[x] 集线器变量桥接,用于跨引擎协调 —
难度:2 | 工作量:S已约 90% 实现。现有的
set_variable/get_variable工具通过getGlobalConnectorVariable()/setGlobalConnectorVariable()与 Hubitat 的全局连接器变量一起工作。这些是规则机器读取/写入的相同变量。通过 MCP 设置的变量对 RM 立即可见,反之亦然。为了正式化:文档中说明共享变量应使用集线器连接器变量。
替代品








