HC3 Lua 場景
以使用者的語言回答;識別碼保留英文。向初學者說明點擊位置。
場景還是 QuickApp?
| 需求 | 場景 | QuickApp |
|---|---|---|
| 對事件(按鈕、門、時間、變數)做出反應並執行少數動作 | ✅ | 較重 |
| 在記憶體中保持狀態、持續執行、與裝置通訊(HTTP、TCP、MQTT) | ❌ 每次執行從頭開始 | ✅ |
| 在使用者介面中顯示按鈕/標籤 | ❌ | ✅ |
| 經驗法則: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:必須持續滿足 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 -- 手動啟動(執行按鈕、App)
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 相同(使用者 vs 手機 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。