@cgjgh/node-red-dashboard-2-ui-scheduler
Version:
A UI scheduler node that integrates with Node-RED Dashboard 2.0
536 lines (461 loc) • 24.6 kB
HTML
<script type="text/javascript">
function _popoutSchedulerHelp(tag) {
const startTag = (name) => `<${name}>`
const endTag = (name) => `</${name}>`
const winHtml = `
${startTag('html')}
${startTag('head')}
${startTag('title')}ui-scheduler 帮助${endTag('title')}
${startTag('style')}
.fade-in {
transition: opacity 1.5s ease-in-out;
}
.hidden {
opacity: 0;
visibility: hidden;
}
${endTag('style')}
${endTag('head')}
${startTag('body')}
${startTag('script')}
const styles = ${JSON.stringify([].map.call(document.querySelectorAll('[rel="stylesheet"]'), e => e.href))}
const head = document.head || document.getElementsByTagName('head')[0]
styles.forEach(href => {
const el = document.createElement('link');
el.rel="stylesheet"
el.href = href
head.appendChild(el);
})
${endTag('script')}
<div class="red-ui-editor help-content hidden" style="height: 100%">
<div class="red-ui-sidebar-info">
<div class="red-ui-sidebar-help-stack red-ui-panels" style="height: 100%;">
<div class="red-ui-panel" style="overflow-y: auto;height: 100%;">
<div class="red-ui-help" style="padding: 6px;height: 100%;">
<h1 class="red-ui-help-title">ui-scheduler</h1>
<div class="red-ui-help">
<span class="red-ui-text-bidi-aware">
${RED.nodes.getNodeHelp('ui-scheduler')}
</span>
</div>
</div>
</div>
</div>
</div>
</div>
${startTag('script')}
if (navigator.clipboard) {
document.querySelector('.ui-scheduler-link-button').classList.add('hidden')
const content = document.querySelector('.help-content');
content.classList.add('hidden')
content.classList.remove('hidden')
content.classList.add('fade-in')
const copyButtonLabel = "复制"
const blocks = document.querySelectorAll("pre.ui-scheduler-code")
blocks.forEach((block) => {
const button = document.createElement("button")
button.innerText = copyButtonLabel
button.classList.add('ui-scheduler-copy-button')
button.addEventListener("click", copyCode)
block.appendChild(button)
})
}
async function copyCode(event) {
const button = event.srcElement
const pre = button.parentElement
const code = pre.querySelector("code")
const text = code.innerText
await navigator.clipboard.writeText(text)
}
${endTag('script')}
${endTag('body')}
${endTag('html')}`
const BOM = new Uint8Array([0xEF, 0xBB, 0xBF])
const winUrl = URL.createObjectURL(
new Blob([BOM, winHtml], { encoding: 'UTF-8', type: 'text/html;charset=UTF-8' })
)
const win = window.open(
winUrl + (tag ? '#' + tag : ''),
'win',
'width=800,height=600'
)
}
</script>
<script type="text/markdown" data-help-name="ui-scheduler">
# 🕙 UI Scheduler 帮助文档
本文档提供了配置 UI Scheduler 节点设置、在 Dashboard UI 中的使用以及附加信息的综合指南。UI Scheduler 允许用户基于时间、本地天文时刻事件或 Cron 表达式自动执行任务。
## 👆 在 Dashboard 2.0 中使用 UI Scheduler
#### 🖥️ 主界面
- **🛠️ 工具栏**:
- **🔍 主题选择器**: 按主题筛选计划。
- **➕ 添加计划按钮**: 打开对话框以创建新计划。
- **☰ 菜单**: 访问其他选项,如检查更新或报告问题。
- **📋 计划表**: 显示所有计划的详细信息,如名称、描述和状态。你可以展开行以查看更多详细信息。
#### 🗓️ 创建计划
1. **🖱️ 打开计划对话框**: 点击工具栏中的 ➕ 按钮。
2. **✏️ 输入计划详细信息**:
- **🏷️ 名称**: 输入计划的唯一名称。
- **📂 主题**: 从下拉列表中选择一个主题。主题在 **节点设置** 中定义
- **⏲️ 类型**: 选择 Time (时间), Solar (本地天文时刻) 或 Cron 计划。
- **🔄 周期**: 对于基于时间的计划,选择重复周期。
- **🕒 时间/日期**: 设置开始时间,如果适用,设置结束时间或持续时间。
- **📦 Payload**: 选择 Payload 类型并根据需要定义自定义 Payload。
3. **💾 保存计划**: 点击 "保存" 添加计划。
#### ✏️ 编辑计划
- **🖊️ 编辑**: 点击表中的计划展开行以查看更多详细信息。点击铅笔图标打开编辑对话框。进行更改并保存。
- - **🗑️ 删除**: 点击删除图标以移除计划。
#### 🔄 导入和导出计划
- **📤 导出**: 点击导出图标将计划 JSON 复制到剪贴板。_仅在编辑计划时可用。_
- **📥 导入**: 点击导入图标并粘贴 JSON 以导入计划。_仅在创建计划时可用。_
#### ⚙️ 管理计划
- **🔄 启用/禁用**: 使用切换开关启用或禁用计划。
### 🚀 高级功能
#### 🌞 本地天文时刻事件
- 基于带有偏移量的本地天文时刻事件自定义计划。
- 支持的事件包括日出、日落和各种暮光阶段。
#### ⏰ Cron 表达式
- 使用 cron 语法满足复杂的计划需求。
- 支持标准 cron 字段和特殊字符。
#### 📦 自定义 Payload
- 使用自定义 Payload 进行计划输出。Payload在 **节点设置** 中定义
- 支持 JSON 和其他数据格式。
## 🛠️ 节点设置
#### 🏷️ 名称
- **字段**: `名称`
- **描述**: 输入计划器的唯一名称。此名称将用于在系统中标识计划器。
- **输入类型**: 文本 (string)
#### 👥 分组
- **字段**: `分组`
- **描述**: 选择此计划器所属的分组。分组有助于在 UI 中组织小部件。
- **输入类型**: 下拉列表 (string)
#### 📏 尺寸
- **字段**: `尺寸`
- **描述**: 调整 UI 中计划器小部件的大小。可以手动设置或使用元素尺寸调整器。
- **输入类型**: 按钮 (元素尺寸调整器)
#### 🏷️ 标签
- **字段**: `标签`
- **描述**: 为计划器设置一个将在 UI 中显示的标签。
- **输入类型**: 文本 (string)
### 🌍 本地化设置
#### 🌐 语言
- **字段**: `语言`
- **描述**: 选择计划器界面的语言。
- 支持的语言包括英语、德语、法语、意大利语、荷兰语、西班牙语、波兰语、捷克语和简体中文。
- 也可编辑 <code>~/.node-red/settings.js</code> 并添加/取消注释以下行: <code>lang: 'zh-CN'</code>。
可用语言代码为: <code>en</code>, <code>de</code>, <code>fr</code>, <code>it</code>, <code>nl</code>, <code>es</code>, <code>pl</code>, <code>cs</code>, <code>zh-CN</code>
这将设置 Node-Red 服务器上 UI Scheduler 节点使用的语言。
- **输入类型**: 下拉列表 (string)
#### ⏰ 时区
- **字段**: `时区`
- **描述**: 指定计划器的时区。这会影响时间的计算和显示方式。
- 留空表示使用系统时区。
- 或者,输入 UTC 或格式为 地区/区域 的时区 ([列表](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones))。
- **输入类型**: 自动完成文本 (string)
#### 🕒 24 小时制
- **字段**: `使用 24 小时制`
- **描述**: 在 24 小时和 12 小时时间格式之间切换。
- **输入类型**: 复选框 (boolean)
### 📍 定位设置
#### 🌐 定位
- **字段**: `定位`
- **描述**: 设置用于本地天文时刻事件计算的默认地理坐标。这可以是固定定位或环境变量。
- **输入类型**: Typed Input (string)
### 📤 输出设置
#### 📬 命令响应消息输出
- **字段**: `命令响应消息输出`
- **描述**: 选择命令响应的输出方式。选项包括:
- 1 个输出: 所有消息发送到输出 1 (计划 + 命令响应)
- 2 个输出: 命令响应发送到输出 1,计划消息发送到输出 2
- 扇出 (Fan out): 命令消息和每个主题的消息分别输出
- **输入类型**: 下拉列表 (string)
#### 📝 输出属性
- **字段**: `输出字段`
- **描述**: 指定消息对象中存储输出的属性。
- 例如,如果 '输出属性' 设置为 **data.value**,则 `msg.data.value` 将包含 *payload* 的值
- `msg.topic` 将包含主题的名称。这简化了区分哪个计划已触发
- 其他属性也会添加到 msg 对象中。检查调试输出 (使用显示完整消息)
- **输入类型**: Typed Input (string)
### 📊 状态设置
#### 📅 发送计划状态
- **字段**: `发送计划状态`
- **描述**: 配置发送计划状态的频率以及是否发送激活或非激活状态。
- 这是按主题分组的,因此如果两个计划对于同一主题都是 `激活` (在开始和结束时间范围内),则只会发送一条 payload 为 `true` 的消息。
- 同样,如果一个主题的一个计划是 `非激活`,而另一个是 `激活`,则只会发送一条 payload 为 `true` 的消息。
- 如果两个计划都 `非激活`,则只会发送一条 payload 为 `false` 的消息。
- **输入类型**: 数字 (间隔), 复选框 (激活/非激活状态) (number, boolean)
### 💾 存储设置
#### 🗄️ 存储名称
- **字段**: `存储名称`
- **描述**: 选择用于持久化计划的存储方法。选项包括:
- 无: 不持久化计划。重新部署节点时计划将丢失
- 本地文件系统: 将计划持久化到本地文件系统。计划保存在 node-red 文件夹下名为 `schedulerdata` 的目录中
- 节点上下文存储: 将计划持久化到节点上下文。这些存储将自动从您的 node-red 设置文件加载。有关更多信息,请参阅 [Node-RED 上下文](https://nodered.org/docs/user-guide/context) 文档。
- **输入类型**: 下拉列表 (string)
### 📨 主题和 Payload
#### 🗂️ 主题
- **字段**: `Topic`
- **描述**: 定义计划器的主题。主题有助于分类和管理计划。
- 这些主题可用于计划的 `Topic` 字段,并可在 Node-Red Dashboard 2.0 UI 中选择。
- 在扇出模式下,计划消息将发送到与主题对应的输出。
- **输入类型**: 可编辑列表 (string)
#### 📦 自定义 Payload
- **字段**: `自定义 Payload`
- **描述**: 定义计划触发时发送的自定义 Payload。
- Payload 可以是各种类型,包括字符串、数字、布尔值和 JSON。
- 此处定义的 Payload 可以在 Dashboard UI 中选择。
- 修改此处的 Payload 值将自动更新使用该 Payload 的所有计划的 Payload 值
- **输入类型**: 带有 Typed Input 的可编辑列表 (string, number, boolean, JSON)
### ⚙️ 高级设置
#### 🕰️ 使用新时间选择器
- **字段**: `使用新时间选择器`
- **描述**: 启用或禁用新的时间选择器界面。
- **输入类型**: 复选框 (boolean)
## 🔧 输入 (高级用法)
#### Topic
大多数命令可以在 Topic 中提供,并在 Payload 中包含计划名称 (如适用)。Topic 支持的命令...
- trigger
- status
- export
- remove
- pause
- stop
- start
包括 `-all`, `-all-dynamic`, `-all-static`, `-topic`, `-active`, `-active-dynamic`, `-active-static`, `-inactive`, `-inactive-dynamic` 和 `-inactive-static` Topic 命令 (例如 export-all, stop-all-dynamic, start-all-static, remove-inactive-dynamic)。有关详细信息,请参阅下面的 [命令](#ui-scheduler-commands-info)。
#### 📦 Payload
可以通过向节点注入 Payload 来动态添加、移除和控制计划。Payload 对象 (或对象数组) 的格式取决于操作。有关详细信息,请参阅下文。您还可以在编辑窗口中从 Dashboard UI 导出计划并粘贴生成的 JSON。
#### ➕ 添加一个 (或多个) 计划
示例...
```json
payload: {
"command": "add",
"schedule": [
{
"name": "Schedule",
"topic": "Topic 1",
"enabled": true,
"scheduleType": "time",
"period": "daily",
"time": "00:00",
"endTime": null,
"days": [
"sunday",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday"
],
"payloadType": true,
"payloadValue": true
},
{
"name": "Schedule 2",
"topic": "Topic 1",
"enabled": true,
"scheduleType": "solar",
"timespan": "time",
"solarEvent": "sunrise",
"offset": 5,
"solarEventStart": false,
"solarEventTimespanTime": "21:00",
"payloadType": "true_false",
"payloadValue": true,
"endPayloadValue": false
},
{
"name": "Schedule 3",
"topic": "Topic 1",
"enabled": true,
"scheduleType": "time",
"period": "minutes",
"duration": 1,
"timespan": "duration",
"minutesInterval": 7,
"payloadType": "true_false",
"payloadValue": true,
"endPayloadValue": false
}
]
}
```
### 📊 获取计划状态或移除 / 停止 / 暂停 / 启动计划
#### Topic方法
```json
msg.topic = "command"; // command name - *see details below*,
msg.payload = "name"; // name of the schedule
```
#### Payload方法
```json
payload: {
"command": "*见下文详情*",
"name": "* 计划名称",
}
```
#### 详情
- command: (string|必填) 要执行的操作 - 可以是以下之一...
- "trigger"
- "status"
- "export"
- "remove"
- "stop"
- "pause"
- "start"
- name: (string|可选) 要影响的计划的名称 (使用 -all, -active 或 -inactive 过滤器时不需要)
#### 📝 备注
- `trigger` 触发 `msg.payload` 中命名的计划
- `status` 返回命名计划的配置和状态对象
- `export` 返回命名计划的配置对象
- `remove` 将停止并移除计划。此选项无输出。
- `stop` 将停止由 `name` 指定的计划并重置其内部计数器。此选项无输出。
- `pause` 将停止由 `name` 指定的计划,但不会重置其内部计数器。此选项无输出。
- `start` 将 (重新) 启动所有计划。任何达到限制的计划都将从头开始。暂停的计划将恢复。此选项无输出。
- 过滤器: 向任何这些命令添加 `-all` 将对所有计划进行操作。例如 `status-all` 将返回所有计划的状态
- 过滤器: 向任何这些命令添加 `-all-dynamic` 将仅影响动态计划,例如 `remove-all-dynamic` 将移除所有动态计划
- 过滤器: 向任何这些命令添加 `-all-static` 将仅影响静态计划,例如 `stop-all-static`
- 过滤器: 向任何这些命令添加 `-topic` 将仅影响Topic与Payload中指定的Topic匹配的计划,例如 `stop-topic`
- 过滤器: 向 status, export 和 remove 命令添加 `-active` 将对所有激活的计划进行操作。例如 `status-active`
- 过滤器: 向 status, export 和 remove 命令添加 `-active-static` 将对所有激活的静态计划进行操作。例如 `status-active-static`
- 过滤器: 向 status, export 和 remove 命令添加 `-active-dynamic` 将对所有激活的动态计划进行操作。例如 `status-active-dynamic`
- 过滤器: 向 status, export 和 remove 命令添加 `-inactive` 将对所有非激活的计划进行操作。例如 `status-inactive`
- 过滤器: 向 status, export 和 remove 命令添加 `-inactive-static` 将对所有非激活的静态计划进行操作。例如 `status-inactive-static`
- 过滤器: 向 status, export 和 remove 命令添加 `-inactive-dynamic` 将对所有非激活的动态计划进行操作。例如 `status-inactive-dynamic`
#### 📖 示例
- 使用简单的Topic命令手动触发名为 "schedule1" 的计划
```json
msg: {
"topic": "trigger",
"payload": "schedule1"
}
```
- 使用带有Payload中Topic的简单Topic命令启动具有指定Topic的所有计划
```json
msg: {
"topic": "start-topic",
"payload": { "topic": "Topic 1" }
}
```
- 使用简单的Topic命令导出所有动态添加的计划...
```json
msg: {
"topic": "export-all-dynamic"
}
```
- 使用简单的Topic命令删除名为 "schedule1" 的计划
```json
msg: {
"topic": "remove",
"payload": "schedule1"
}
```
- 使用 cmd Payload暂停所有计划...
```json
payload: {
"command": "pause-all"
}
```
- 使用简单的Topic命令删除所有已完成的动态计划
```json
msg: {
"topic": "remove-inactive-dynamic"
}
```
### 🔍 Describe (描述)
#### 示例: cmd Payload描述 cron 表达式
```json
{
"command": "describe",
"expressionType": "cron",
"expression": "0 */5 * * * MON *",
"timeZone": "Europe/London"
}
```
#### 示例: cmd Payload获取此时所有本地天文时刻事件时间 + 本地天文时刻状态
```json
{
"command": "describe",
"expressionType": "solar",
"location": "54.9992500,-1.4170300",
"solarType": "all",
"timeZone": "Europe/London"
}
```
#### 示例: cmd Payload获取特定时间点的 4 个本地天文时刻事件时间 + 本地天文时刻
```json
{
"command": "describe",
"expressionType": "solar",
"time": "2020-03-22 18:40",
"location": "54.9992500,-1.4170300",
"solarType": "selected",
"solarEvents": "civilDawn,sunrise,sunset,civilDusk",
"timeZone": "Europe/London"
}
```
#### 详情
在Payload中返回一个包含给定表达式的可读信息的对象。
- command: (string|必填) 要执行的操作
- expression: (string|必填) 要描述的表达式
- timeZone: (string|可选) 要使用的时区。留空表示系统时区。或者,输入 UTC 或格式为 地区/区域 的时区 ([列表](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones))
## 附加信息
### ⏰ CronExpression
CRON 表达式,日期,逗号分隔的日期列表或日期数组。
##### 📅 日期或日期序列格式
当您希望使用固定日期或日期序列时,表达式可以是字符串日期,逗号分隔的日期列表,日期数组 (数组可以包含字符串、日期对象和时间戳的混合)。指定字符串日期时,可以使用时区,例如 "2020-01-01 00:00 GMT+2"。甚至可以混合使用时区,例如 "2020-01-01 00:00 GMT+2, 2020-01-01 00:00 GMT-7"。
##### ⏲️ CRON 格式
```
* * * * * * * 字段 允许值 特殊符号
| | | | | | | ----------------- --------------- ---------------
`-|-|-|-|-|-|-> 秒 (可选) 0-59 * / , -
`-|-|-|-|-|-> 分 0-59 * / , -
`-|-|-|-|-> 小时 0-23 * / , -
`-|-|-|-> 日 1-31 * / , - ? L W
`-|-|-> 月 1-12 or JAN-DEC * / , -
`-|-> 星期 0-7 or SUN-SAT * / , - ? L #
`-> 年 (可选) 1970-2099 * / , -
```
##### 📝 备注
- `*` 星号表示 cron 表达式匹配字段的所有值。例如,分钟字段中的 "*" 表示每分钟。
- `?` 问号用于指定 '无特定值',允许用于日和星期字段。使用它代替星号 (*) 以将日或星期字段留空。
- `-` 连字符用于定义范围。例如,小时字段中的 "10-12" 表示 10、11 和 12 点。
- `,` 逗号用于分隔列表项。例如,星期字段中的 "MON,WED,FRI" 表示星期一、星期三和星期五。
- `/` 斜杠用于表示增量。例如,秒字段中的 "0/15" 表示秒 0, 15, 30, 和 45。此外,日字段中的 "1/3" 表示从该月第一天开始每 3 天。
- `L` "last" (最后) 的简写,允许用于日和星期字段。字符 "L" 在这两个字段中含义不同。例如,日字段中的 "L" 表示该月的最后一天。如果在星期字段中使用,则表示 7 或 SAT (星期六)。但是,如果在星期字段中的另一个值之后使用它,则表示该月的最后一个 xxx 日。例如,星期字段中的 "6L" 表示该月的最后一个星期五。
- `W` "weekday" (工作日) 的简写,允许用于日字段。字符 "W" 用于指定最接近给定日期的工作日。例如,日字段中的 "15W" 表示最接近该月 15 日的工作日。因此,如果 15 日是星期六,则任务在 14 日星期五运行。"L" 和 "W" 字符可以在日字段中组合使用。例如,"LW" 表示该月的最后一个工作日。
- `#` 井号指定构造。例如,星期字段中的 "6#3" 表示该月的第三个星期五。
##### 📖 示例
- `* * * * * *` 每秒
- `0 * * * * *` 每分
- `0 */10 * * * *` 每 10 分钟
- `0 */20 1 * * *` 每 20 分钟,在 01:00 AM 和 01:59 AM 之间
- `0 15,30,45 * * * *` 在每小时的 15, 30, 和 45 分
- `0 0 12 * * *` 每天中午 - 12pm
- `0 0 2 29 FEB * 2020/4` 在 02:00 AM,2 月 29 日 (闰年)
- `0 0 7 * * MON#1 *` 在 07:00 AM,每月的第一个星期一
- `0 0 12 * JAN,FEB,MAR,APR *` 每天中午,在 1, 2, 3, 4 月
- `* * 1W * *` 每分钟,在每月的第一个工作日
- `* * * * Tue#3` 每分钟,在每月的第三个星期二
- `0 12 * * MONL` 在 12:00 PM,在每月的最后一个星期一
请参阅 [这里](https://github.com/jaclarke/cronosjs) 获取更多示例和信息。
#### 🌅 本地天文时刻事件
| 事件 ID | 事件 | 信息 |
|----------|-------|-------------|
| nightEnd | 夜间结束 / 天文晨光始 | 夜间结束,天文曙光开始 (-18°) |
| nauticalDawn | 航海晨光始 | 天文曙光结束,航海曙光开始 (-12°) |
| civilDawn | 民用晨光始 / 黄金时刻 | 航海曙光结束,民用曙光和黄金时刻开始 (-6°) |
| sunrise | 日出开始 | 太阳上边缘出现在地平线上 (-0.833°) |
| sunriseEnd | 日出结束 | 太阳下边缘接触地平线 (-0.3°) |
| morningGoldenHourEnd | 早晨黄金时刻结束 | 当太阳在地平线上方 6 度时 (6°) |
| solarNoon | 正午 | 太阳处于最高位置 |
| eveningGoldenHourStart | 傍晚黄金时刻开始 | 当太阳在地平线上方 6 度时 (6°) |
| sunsetStart | 日落开始 | 太阳下边缘接触地平线 (-0.3°) |
| sunset | 日落结束 | 民用暮光开始,太阳消失在地平线以下 (-0.833°) |
| civilDusk | 民用昏影终 / 黄金时刻结束 | 民用暮光和黄金时刻结束,航海暮光开始 (-6°) |
| nauticalDusk | 航海昏影终 | 航海暮光结束,天文暮光开始 (-12°) |
| nightStart | 天文昏影终 / 夜间开始 | 天文暮光结束,夜间开始 (-18°) |
| nadir | 午夜 | 当太阳最接近天底且夜间与黄昏和黎明等距时 |
#### 📝 一般说明
- 添加具有相同名称的现有计划将替换现有计划
- 当 ui-scheduler 节点响应命令输出 msg 时,`msg.commandResponse` 将为 `true` 以指示消息是对命令的响应,而不是计划事件
- 当 ui-scheduler 节点输出 cron/solar 事件的 msg 时,`msg.scheduledEvent` 将为 `true` 以指示消息是由于计划事件,而不是控制响应
</script>