JohnFLand/Private-Boolean-Manager
GitHub: JohnFLand/Private-Boolean-Manager
一款 Hubitat Elevation 应用,用于批量扫描、检测和管理 Rule Machine 与 Button Controller 规则的 Private Boolean 状态。
Stars: 0 | Forks: 0
# Private Boolean Manager
一个用于 Rule Machine (RM) 和 Button Controller (BC) 规则的 [Hubitat Elevation](https://hubitat.com/) 应用。它有两个主要功能:
1. 扫描 RM/BC 规则,并在可排序的表格中显示每个规则的 **Private Boolean 状态**、**PB 使用检测**和**最后运行时间**。
2. 允许您为多个规则设置 Private Boolean 值,可以通过表格手动设置,也可以按计划自动设置。
## 安装说明
1. 在 Hubitat Web 界面中,转到 **Apps Code → + New App** 并粘贴该应用的 Groovy 源代码。
2. 保存应用代码。
3. 转到 **Apps → + Add User App** 并选择 **Private Boolean Manager**。
4. 应用会在首次打开时尝试自动创建 OAuth token。如果没有,请在 Apps Code 中为此应用手动启用 OAuth,然后重新打开它。
5. 安装后不会自动运行任何扫描。点击 **Scan All Rules for Current PB State** 或 **Scan for Actual PB Use** 开始。
## 用法
### 扫描
提供两种扫描模式:
**Scan All Rules for Current PB State** 仅获取每个规则的运行时状态:Private Boolean 值和最后运行时间。这是较快的阶段 1 扫描,但如果规则多达数百条,仍可能需要一分钟或更长时间。
**Scan for Actual PB Use** 首先运行阶段 1 扫描,然后运行阶段 2。阶段 2 获取每个规则的内部配置 JSON,并检查规则是否在其条件、动作或触发器中引用了其自身的 Private Boolean。阶段 2 使用排队的 `configure/json` 过程,如果有数百条规则,特别是某些规则非常大的情况下,可能需要 5–10 分钟甚至更长时间。
在 PB 使用扫描运行之前,每个 **PB Use Detected** 单元格都会显示一个破折号(`—`)。PB 使用扫描完成后,如果检测到 PB 使用,单元格会显示一个绿色勾号(`✓`),如果未检测到使用,则显示破折号(`—`)。
扫描后,顶部摘要会显示已扫描规则、PB TRUE、PB FALSE 和 PB Use Detected 的计数。扫描时间行在仅当前状态扫描时仅显示阶段 1 的时间,而在完整的 PB 使用扫描中则会显示阶段 1、阶段 2 和总时间。
点击 **Done** 并重新打开应用会根据缓存数据重新渲染表格,因此如果仅为显示而进行更改则无需重新扫描。在运行新扫描之前,缓存的表格仍然是陈旧的。
### 规则状态表
该表格列出了每个发现的 RM 和 BC 规则,包含以下列:
| 列名 | 描述 |
|--------|-------------|
| **Set TRUE** | 复选框 — 标记此规则,使其在下次应用时将 PB 设置为 TRUE |
| **Set FALSE** | 复选框 — 标记此规则,使其在下次应用时将 PB 设置为 FALSE |
| **Rule ID** | 规则的 Hubitat 内部 app ID |
| **Rule** | 规则名称,直接链接到其配置页面 |
| **App Type** | `RM` 表示 Rule Machine,或 `BC` 表示 Button Controller |
| **Current PB State** | 规则的 Private Boolean 值:**TRUE** 为粗体蓝色,FALSE 为灰色,如果不可读则为 `—` |
| **PB Use Detected** | 规则是否引用了其自身的 PB |
| **Last Run** | 最近触发事件的日期和时间,格式化为 `yyyy-MM-dd HH:mm` |
**排序** — 点击任何列标题可按该列排序;再次点击可反转排序方向。
**筛选** — 使用表格上方的通配符/名称筛选器可仅显示匹配的规则。筛选状态在不点击 **Done** 的情况下也会保持。
**隐藏列** — 列隐藏按钮可让您显示或隐藏受支持的列。列可见性在不点击 **Done** 的情况下也会保持。
**隐藏没有 PB 使用的行** — 隐藏所有 **PB Use Detected** 为 `—` 的行,包括没有陈旧红色勾号的陈旧扫描。点击 **Show all rows** 恢复隐藏的行。
**批量行按钮** — **All TRUE**、**All FALSE** 和 **All Clear** 会跳过隐藏的行。
### PB Use Detected 列
**PB Use Detected** 列显示规则是否在其条件、动作或触发器中引用了其自身的 Private Boolean。
| 单元格 | 含义 |
|------|---------|
| 绿色 **✓** | 当前的阶段 2 扫描在此规则中检测到了 PB 使用 |
| 红色 **✓** | 之前的阶段 2 扫描检测到了 PB 使用,并且此后仅运行了阶段 1 扫描;该结果已陈旧 |
| **—** | 未检测到 PB 使用,或者尚未运行 PB 使用扫描 |
完整的 **Scan for Actual PB Use** 是阶段 1 和阶段 2 的组合扫描。完成后,检测到的 PB 使用将显示为绿色勾号。之后,如果您仅运行 **Scan All Rules for Current PB State**,之前的 PB 使用检测结果将作为红色的陈旧勾号保留。再次运行 **Scan for Actual PB Use** 会刷新 PB 使用单元格,并将新的检测返回为绿色。
PB 使用检测从以下位置读取每个规则的内部配置 JSON:
```
/installedapp/configure/json/{id}
```
它会搜索两个已确认的 RM 5.0 模式:
- `"getSetPrivateBoolean"` — 规则动作将 PB 设置为 TRUE 或 FALSE 时的 `actSubType` 值。
- `:"Private Boolean"` — 在条件或触发器中引用 PB 时的 `rCapab_N` 或 `tCapab_N` 值。
### 设置 Private Booleans
#### 复选框列 — 批量应用
每行都有 **Set TRUE** 和 **Set FALSE** 复选框。
- 勾选其中一个会自动清除该行的另一个。
- 两者都不勾选表示该规则没有变化。
- 复选框选择在页面刷新和 Done/重新打开周期中保持不变。
批量按钮仅对可见行进行操作。被过滤掉或隐藏的行将被跳过。
| 按钮 | 动作 |
|--------|--------|
| **All TRUE** | 勾选每个可见行的 Set TRUE,并清除 Set FALSE |
| **All FALSE** | 勾选每个可见行的 Set FALSE,并清除 Set TRUE |
| **All Clear** | 清除每个可见行的 Set TRUE 和 Set FALSE |
点击 **Apply selected PB changes** 将所有待处理的更改发送到 Hub。表格会立即更新,但应用不会重新读取受影响的规则以验证 Hub 是否接受了更改。如果重新扫描后某个规则的 PB 值似乎没有改变,Hub 可能已静默拒绝了该操作,例如由于 RM 版本错误或该规则自上次扫描后已被删除。
#### Current PB State 列 — 表内切换
点击任何 **Current PB State** 单元格可原地切换该规则的 PB。
- TRUE 以粗体蓝色显示。
- FALSE 以灰色显示。
- 显示为 `—` 的单元格表示 PB 状态无法读取,且不可点击。
与批量应用一样,该切换会立即更新表格,并且不会重新读取规则以确认更改已生效。
### 计划 PB 应用
在 **Controls** 部分提供了三个独立的计划选项。它们可以任意组合同时启用。每个选项都会应用当前已保存的 Set TRUE / Set FALSE 复选框状态 — 即与 **Apply selected PB changes** 使用的相同状态。
| 选项 | 如何配置 |
|--------|-----------------|
| **Daily at a specific time** | 在 **Apply PB changes daily at:** 中设置一个时间,然后点击 Done |
| **Every N minutes** | 从 **Apply PB changes every:** 中选择一个间隔(1、2、5、10、15、20、30 或 60 分钟),然后点击 Done |
| **After hub reboot** | 启用 **Apply PB changes after hub reboot** 并可选地设置延迟(0–60 分钟);点击 Done |
首次运行后,上次运行的时间戳和 TRUE/FALSE 计数将显示在计划输入项下方。清除或禁用某个计划并点击 Done 即可将其移除。计划的更改采用“即发即忘”模式,不会通过重新读取规则状态来进行验证。
### 报告
在 **Controls** 部分,扫描完成后:
- **Open Printable Report** 会打开一个包含已扫描规则且格式化的 HTML 报告。
- **Download CSV** 将相同的表格数据下载为 CSV 文件。
报告使用最近一次扫描的缓存数据。如果 PB 使用检测结果已陈旧,可打印报告和 CSV 会在适用的地方指示出陈旧的结果。
## Controls 部分
| 控件 | 描述 |
|---------|-------------|
| **App instance name** | 重命名此应用实例 |
| **Open Printable Report** | 扫描完成后打开可打印的 HTML 报告 |
| **Download CSV** | 扫描完成后下载 CSV 导出文件 |
| **Apply PB changes daily at:** | 可选的每日计划 |
| **Apply PB changes every:** | 可选的间隔计划(1–60 分钟) |
| **Apply PB changes after hub reboot** | 可选的重启后应用,带有可配置的延迟 |
| **Enable debug logging** | 打开向 Hubitat 日志输出的详细调试信息;30 分钟后自动禁用 |
## 调试日志记录
在 Controls 部分开启 **Enable debug logging** 后,Hubitat 日志中将出现以下附加输出:
- **逐规则的阶段 1 结果** — 扫描时每个规则的规则名称、ID、app 类型和 Private Boolean 值
- **逐规则的阶段 2 结果** — 每个规则的 `configure/json` 响应的 PB 使用检测结果(`pbUsed=true/false`)
- **阶段 2 心跳重置** — Phase 2 看门狗计时器每次被已完成的 callback 重置时
- **单规则 PB 切换确认** — 点击 Current PB State 单元格时的规则 ID 和动作
- **生命周期事件** — 在安装时以及每次按下 Done 时记录(包括当前标签以及是否有正在进行的扫描)
- **规则发现计数** — 扫描开始前由 `/hub2/appsList` 找到的 RM/BC 规则数量
- **计划设置确认** — 每次按下 Done 时的每日时间、间隔和 systemStart 订阅状态
- **从缓存重新渲染确认** — 按下 Done 时根据缓存数据重建表格时
调试日志记录会在 30 分钟后自动禁用,以避免填满 Hub 日志。
## 技术说明
该应用使用以下 Hubitat 本地/内部 endpoint:
| Endpoint | 用途 |
|----------|---------|
| `/hub2/appsList` | 发现 RM 和 BC 规则 |
| `/installedapp/statusJson/{appId}` | 在阶段 1 期间读取逐规则的 PB 状态和最后运行时间 |
| `/installedapp/configure/json/{appId}` | 在阶段 2 期间读取逐规则的配置 JSON 以进行 PB 使用检测 |
| `/apps/api/{appId}/setPB` | 表内单规则 PB 切换 |
| `/apps/api/{appId}/bulkPB` | 根据复选框批量应用 PB |
| `/apps/api/{appId}/setpref` | 持久化列隐藏、筛选和复选框首选项 |
| `/apps/api/{appId}/report` | 可打印的 HTML 报告 |
| `/apps/api/{appId}/RM-BC_Rules.csv` | CSV 导出 |
Private Boolean 更改使用 `RMUtils.sendAction()`,目标为 **Rule Machine 版本 5.0**。在早期 Rule Machine 版本下创建的规则可能会正确显示其 PB 状态,但 PB 更改可能会被静默忽略。
## 限制
- **无写入验证。** PB 更改采用“即发即忘”模式。表格会根据请求的值进行乐观更新。运行 **Scan All Rules for Current PB State** 以从 Hub 确认实际规则状态。
- **内部 Hubitat API。** 该应用依赖于内部 JSON endpoint,其结构可能会在未来的 Hubitat 平台版本中发生更改。
- **RM 5.0 PB 动作。** PB 设置使用 `RMUtils.sendAction()` 且 RM 版本为 `5.0`;较旧的 Rule Machine 规则可能不接受 PB 更改。
- **庞大的阶段 2 响应。** 非常大的规则配置 JSON 可能会超时或被丢弃。该规则在 PB Use Detected 中将显示为 `—`,并且扫描将继续进行。
- **Basic Button Controller 被排除在外。** Basic Button Controller 规则不包含在内,因为它们使用不同的内部结构。
- **缓存的显示可能会陈旧。** 点击 **Done** 并重新打开可能会在不重新扫描的情况下重新渲染缓存数据;运行一次扫描以刷新实际的 Hub 状态。
## 致谢
最初由 John Land 设计。由 Claude AI 构建,并由 ChatGPT 协助。表内可点击单元格的 PB 切换技术改编自 **hubitrep** 的成果。
标签:Groovy, Hubitat, 云计算, 多模态安全, 智能家居, 状态监控, 自动化管理, 规则引擎