HC3 Lua 场景
用用户的自然语言回答;标识符保持为英文。向初学者解释在哪里点击。
场景还是 QuickApp?
| 需求 | 场景 | QuickApp |
|---|---|---|
| 响应事件(按钮、门、时间、变量)并执行少量动作 | ✅ | 较重 |
| 在内存中保持状态、持续运行、与设备通信(HTTP、TCP、MQTT) | ❌ 每次运行从零开始 | ✅ |
| UI 中的按钮/标签 | ❌ | ✅ |
经验法则:QuickApp 是驱动程序,场景通过调用 QA 方法串联动作链(fibaro.call(qaId, "setMode", "Away"))。对于 QuickApp,请使用 hc3-quickapp 技能。 |
两部分
- 声明(条件/触发器):Lua 表,而非代码——何时场景启动。
- 动作:每次启动时执行的 Lua 代码。 提示:先在 块模式 中构建场景,然后“转换为 Lua”:HC3 会生成精确的声明(属性名称、星期编号)。转换是单向的。
声明
{
operator = "all", -- "all"(AND)| "any"(OR);组可以嵌套
conditions = {
{ type = "device", id = 201, property = "value", operator = "==", value = true, isTrigger = true },
{ type = "date", property = "cron", operator = "match", value = {"*", "*", "*", "*", "*", "*"}, isTrigger = false },
}
}
isTrigger = true:此条件的变化会启动场景(然后评估所有条件);false:仅作为过滤器。至少需要一个触发器,否则场景永远不会自行启动。- 运算符:
==、!=、>、>=、<、<=、anyValue(任意变化)、match(日期)。 - 设备条件中的
duration = 60:必须保持 true 60 秒 [V](在转换后的块场景中可见)。 条件类型和示例:references/declarations.md(设备、中央场景按钮、定时、日出日落、全局变量、自定义事件、警报、位置、天气、HC3 启动)。
动作
fibaro.debug("MyScene", json.encode(sourceTrigger)) -- 开发时第一行:查看是什么启动了场景
if sourceTrigger.type == "device" then -- .id, .property, .value
elseif sourceTrigger.type == "date" then
elseif sourceTrigger.type == "user" then -- 手动启动(运行按钮、应用)
end
函数:fibaro.call、fibaro.getValue、fibaro.get(值 + 时间戳)、fibaro.getGlobalVariable / setGlobalVariable(字符串)、fibaro.getSceneVariable / setSceneVariable(在同一场景的多次运行之间持久化)、fibaro.alert、fibaro.emitCustomEvent、fibaro.scene("execute"|"kill", {ids})、fibaro.profile、fibaro.alarm、fibaro.setTimeout(ms, fn)、api.*、net.HTTPClient、json。日志需要标签:fibaro.debug("Tag", "msg")。
通知:规则与 QuickApp 相同(用户与手机 ID,无关键推送)——请参见 hc3-quickapp 技能、references/notifications.md。
陷阱(在回答“我的场景不工作”之前阅读)
- 运行之间没有内存 → 使用场景变量或全局变量。
- “允许重新启动正在运行的场景” 选项:是 = 新触发器会终止正在运行的实例(待处理的
setTimeout丢失)并重新开始——适用于“最后一次运动后 5 分钟关灯”;否 = 在运行期间忽略触发器(包括setTimeout等待期间)。 - 手动模式忽略声明。
- 触发器仅在变化时触发:相同值再次出现 → 无反应。
- 值类型:开关
true/false、调光器/卷帘 0–99、传感器数值;全局变量始终是字符串(== "1",而非== 1);在声明中写value = true不带引号。 - 改变自身触发设备的场景可能造成循环:用
sourceTrigger过滤。 - 只有设备属性能触发场景;QuickApp 的内部变量不能(全局变量可以,且 QA 属性更新如
value可以)。 - 避免
while true/ 长时间fibaro.sleep:使用触发器、setTimeout或 QuickApp。 - 定时中的星期编号和某些属性名称可能不同:检查转换后的块场景 [V]。
交付物
声明块 + 动作块(分开,可粘贴)、要设置的场景选项(重启是/否、自动模式、房间)、需要替换的 ID(ID_DOOR_SENSOR…)或用户库存中的真实 ID,以及测试步骤(“打开门,场景的控制台显示……”)。工作示例:references/examples.md。