HC3 Lua 장면
사용자의 언어로 답변하세요. 식별자는 영어로 유지하세요. 초보자에게는 클릭할 위치를 설명하세요.
장면(Scene) 또는 QuickApp?
| 용도 | 장면 | QuickApp |
|---|---|---|
| 이벤트(버튼, 문, 시간, 변수)에 반응하여 몇 가지 동작 수행 | ✅ | 더 무거움 |
| 메모리에 상태 유지, 영구 실행, 장치와 통신(HTTP, TCP, MQTT) | ❌ 매 실행마다 처음부터 시작 | ✅ |
| UI에 버튼/레이블 표시 | ❌ | ✅ |
| 경험 법칙: QuickApp은 드라이버 역할을 하고, 장면은 QA 메서드를 호출하여 동작을 연결합니다 | ||
(fibaro.call(qaId, "setMode", "Away")). QuickApp의 경우 hc3-quickapp 스킬을 사용하세요. |
두 부분
- 선언(Declarations) (조건/트리거): Lua 테이블 — 코드가 아님 — 장치가 언제 시작되는지 정의.
- 액션(Actions): 각 시작 시 실행되는 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초 동안 true 상태를 유지해야 함 [V] (변환된 블록 장면에서 볼 수 있음). 조건 유형 및 예제:references/declarations.md(장치, 중앙 장면 버튼, cron, 일출/일몰, 전역 변수, 사용자 정의 이벤트, 알람, 위치, 날씨, 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("태그", "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 사용.- cron의 요일 번호와 일부 속성 이름은 다를 수 있음: 변환된 블록 장면을 확인하세요 [V].
결과물
선언 블록 + 액션 블록 (따로 분리, 붙여넣기 준비됨), 설정할 장치 옵션 (재시작 예/아니오, 자동 모드, 방), 대체할 ID (ID_DOOR_SENSOR… ) 또는 사용자 인벤토리의 실제 ID, 그리고 테스트 절차 ("문을 열면 장치 콘솔에 ... 표시됨"). 작업 예제: references/examples.md.