AoT_facility 위젯~
AoT_facility 위젯은 대시보드에 시설(건물)의 3D 뷰, 실시간 환경 값, 그리고 통합환경제어(IEC) 함수가 연결돼 있으면 목표값 편집과 액추에이터 제어까지 함께 보여줍니다.
위젯 추가~
- 대시보드에서 위젯 추가 → AoT 시설 선택
- 설정에서 IEC 함수 를 선택합니다 — 시설 자체가 아니라
env_coordinator함수를 고릅니다. 시설은 그 함수의 설정에서 자동으로 찾아집니다. - IEC 함수 를 비워 두면 활성화된 첫
env_coordinator함수를 자동으로 고릅니다(활성화된 것이 없으면 이름순 첫 함수).env_coordinator함수가 하나도 없거나 고른 함수에 시설이 설정돼 있지 않으면 가장 최근에 수정된 시설로 대체됩니다. 연결된 함수가 없으면 상태 스트립은 "No IEC function linked to this facility" 사유와 함께IDLE로 표시되지만(센서 상태가 나쁘면 더 높은 단계), 목표값 편집과 액추에이터 패널은 그대로 동작합니다 — 둘 다 시설에 직접 작용하기 때문입니다. - 저장 클릭
화면 구성~
0. 상태 스트립~
상태 표시줄 표시 가 켜져 있을 때 표시됩니다. /api/aot/facility/<uuid>/status 를 5초마다 조회하는 배지입니다.
| 단계 | 의미 |
|---|---|
IDLE | 연결된 IEC 함수가 없거나, 보고할 내용이 없음 |
ACTIVE | 연결된 함수가 최근 제어 사이클을 실행했거나, 작동 중인 액추에이터가 하나 이상 있음 |
WARN | 연결된 함수가 비활성 상태이거나, 사이클 주기의 3배(최소 5분) 안에 사이클 보고가 없거나, 시설 센서 일부가 응답하지 않거나, VPD가 목표에서 0.15 kPa 넘게 벗어났거나, CO₂가 목표보다 10 % 넘게 높음 |
EMERGENCY | 시설 센서의 절반 미만만 정상 응답하거나, VPD가 목표에서 0.45 kPa 넘게 벗어났거나, 실내 온도가 안전 한계를 벗어남 |
ERR | 상태 조회 자체가 실패 — 타임스탬프 자리에 "연결 오류" 가 표시됨 |
배지 옆에는 연결된 함수의 이름, 그 단계의 근거와, 활성/전체 액추에이터 수가 함께 표시된 타임스탬프가 나옵니다.
A. 3D 뷰~
Three.js로 렌더링된 시설 건물 모델입니다. /geo/facility 에서 설정한 외피 파라미터(동 치수, 피복 자재 등)로 자동 생성됩니다.
- 마우스 오른쪽 버튼 드래그: 회전
- 마우스 왼쪽 버튼 드래그: 이동
- 스크롤: 줌
- Preset 배지: 시설의 구조 프리셋
- "연동 xN" 배지: 여러 동이 연결된(연동) 구조일 때 표시
- "이중 피복" 배지: 외피가 2중 피복일 때 표시
- 레이어 버튼: 외피·창호·공조·센서·조명·관수를 켜고 끕니다
- 아래쪽 가장자리: 끌어서 뷰 높이를 바꿉니다. 높이와 카메라 각도는 이 브라우저에 기억됩니다
B. 환경~
실시간 값이 표시되는 7개 셀입니다. 목표값 표시 가 켜져 있고 제어 권한(edit_settings)이 있으면, 그중 2개는 클릭해 범위 편집창을 열 수 있습니다.
| 셀 | 범위 편집 가능? |
|---|---|
| VPD | 불가 — 목표는 연결된 프로그램에서 정함 |
| 실내 온도 | 가능 — 안내 범위와 하드 안전 한계 |
| 실내 습도 | 가능 — 안내 범위와 하드 안전 한계 |
| CO₂ | 불가 — 목표는 연결된 프로그램에서 정함 |
| 실외 온도 | 불가 — 기상 데이터 또는 외부 센서 |
| 바람 | 불가 — 기상 데이터 또는 풍속 센서 |
| 태양광 | 불가 — 기상 데이터 또는 일사 센서 |
값이 없으면 — 로 표시됩니다. VPD·CO₂ 셀은 현재 목표값을 함께 보여주는데, 이는 제어가 연결된 프로그램 단계에서 읽는 것과 같은 방식으로 구한 값(effective target)이며(그 단계 목표가 곡선을 따르면 "곡선을 따릅니다"로 표시), 따로 저장된, 제어와 몰래 어긋날 수 있는 숫자가 아닙니다. 실내 온도·습도 셀은 목표값 대신 각자의 안내 범위를 보여줍니다. 네 셀 모두 값이 그 목표·범위에서 얼마나 벗어났는지에 따라 색이 입혀집니다.
편집창에는 셀마다 두 쌍이 있습니다 — VPD 목표를 온도와 습도로 나눌 때 머무는 폭인 안내 범위, 그리고 목표와 무관하게 보호 동작을 강제하는 하드 안전 한계입니다. 목표는 여기서 정할 수 없습니다 — 목표를 이 편집창으로 보내면 거부하고, 프로그램에서 정하는 값이라고 알려줍니다.
D. 액추에이터 제어~
액추에이터 그리드 표시 가 켜져 있을 때 표시됩니다. 시설에 연결된 액추에이터를 종류별로 묶어 보여줍니다 — 창호, 보온, 차광, 관수, 기타(액추에이터가 없는 묶음은 숨기고, 하나도 없으면 "등록된 작동장치가 없습니다"가 나옵니다). 제어 권한(edit_settings)이 있는 사용자에게는 읽기 전용 표시가 아니라 실제로 작동하는 제어면입니다. 각 행의 조작 방식은 액추에이터 구동 방식에 따라 다릅니다.
| 액추에이터 | 조작 |
|---|---|
| 위치형(예: 개폐 한 쌍 모터) | 0–100 % 슬라이더. 트랙 위의 점이 현재 위치를 가리키고, 그 위에 마지막 목표값(누가 정했는지에 따라 수동 또는 시스템)과 현재 위치 가 나옵니다. |
| PWM | 0–100 % 듀티 사이클 슬라이더. |
| 켜짐/꺼짐 | ON / OFF 버튼. |
슬라이더는 손을 뗄 때, 버튼은 누를 때 명령을 보냅니다. 안전 게이트가 걸려 있는 동안 — 예를 들어 강풍 — 게이트가 강제하는 값과 어긋나는 명령은 거부되고 장치는 그대로 있습니다. 위젯에는 안내가 뜨지 않으니, 행이 고장 났다고 보기 전에 게이트를 먼저 확인하세요. 게이트와 어긋나지 않는 명령(풍속 게이트 중 난방기 켜기)은 수동 적용으로 그대로 나갑니다. 행의 손잡이를 끌어 같은 묶음 안에서 순서를 바꿀 수 있으며, 순서는 시설별로 저장됩니다. edit_settings 권한이 없는 사용자에게는 같은 행이 읽기 전용으로 보이고 슬라이더·버튼·손잡이는 나오지 않습니다. 값은 주기 (초) 마다 갱신됩니다.
비상 정지 표시 가 켜져 있으면 그리드 아래에 긴급 정지 버튼이 놓입니다 — 기본값은 꺼짐이고, 제어 권한이 있는 사용자에게만 나옵니다. 누르면 확인을 물은 뒤 이 시설의 모든 액추에이터를 안전 상태로 보냅니다. 자동 제어도 함께 멈춥니다 — 연결된 활성 함수에는 그 함수의 긴급 정지 를 그대로 보내, 다음 제어 사이클을 60초 동안 보류해 장치를 곧바로 되돌리지 못하게 합니다. 연결된 활성 함수가 없으면 출력을 직접 안전 상태로 보냅니다. 결과는 도달한 액추에이터 수와 함께 안내 메시지로 표시됩니다(긴급 정지와 안전 상태).
E. AI 조언~
실험적 기능 — 운영 환경에서는 꺼 둘 것
이 패널은 현재 하드코딩된 텍스트의 가짜(mock) 데모 카드를 보여줄 뿐, 실제 조언이 아닙니다. 하지만 승인하고 적용 버튼은 /api/geo/facility/<uuid>/apply 를 통해 실제 액추에이터 명령을 내보냅니다. 실제 조언 백엔드가 연결되기 전까지는 AI 조언 표시 를 켜지 마세요.
위젯 설정 옵션~
일반~
| 옵션 | 설명 | 기본값 |
|---|---|---|
| 주기 (초) | 실시간 데이터 갱신 주기. 0이면 자동 갱신을 끕니다. | 60 |
| IEC 함수 | 연결할 env_coordinator 함수. 시설은 여기서 자동으로 따라옵니다. | (자동 선택) |
| AI 조언 표시 (§ E) — 실험적 기능 | 위 경고 참조 — 고정 문구의 데모 카드이며, 카드가 장치 명령을 보내지는 않습니다. | Off |
통합 환경 제어 (IEC)~
| 옵션 | 설명 | 기본값 |
|---|---|---|
| 상태 표시줄 표시 (§ 0) | 긴급/경고/작동중/대기 배지. | On |
| 목표값 표시 (§ C) | § B 셀을 클릭해 여는 온도·습도의 안내 범위와 안전 한계 편집. edit_settings 권한 필요. | On |
| 액추에이터 그리드 표시 (§ D) | 액추에이터 제어 패널. | On |
| 비상 정지 표시 | 액추에이터 그리드(§ D) 아래의 ALL STOP 버튼. edit_settings 권한 필요. | Off |
3D 렌더링~
| 옵션 | 설명 | 기본값 |
|---|---|---|
| 렌더 모드 | 기본 (반투명)(반투명 외피) · 단색 (불투명)(불투명, 오버드로우 감소) · 와이어프레임(윤곽선만) · 성능 (모바일)(모바일용 단순 셰이딩+저해상도) 중 선택. | 기본 (반투명) |
센서 레이블~
3D 화면의 각 센서 옆에 실시간 측정값을 표시하는 라벨입니다.
| 옵션 | 설명 | 기본값 |
|---|---|---|
| 센서 레이블 표시 | On | |
| 최대 표시 채널 수 | 라벨 하나에 보여줄 값 개수(1~5). 초과분은 "+"로 접힘. | 1 |
| 소수점 자리수 | 라벨 값의 소수점 자리수(0~3). | 1 |
| 레이블 크기 (em) | 글자 크기(0.5~2.0). | 0.85 |
| 레이블 배경 | CSS 색상. | rgba(15,23,42,0.78) |
| 레이블 글자 색상 | CSS 색상. | #f8fafc |
| 수직 오프셋 (m) | 센서 위 라벨이 붙는 높이(0.0~2.0). | 0.25 |
| 레이블 투명도 | 0.0~1.0. | 0.7 |
| 센서 팝업 사용 | 라벨을 클릭하면 최근 24시간 그래프 팝업이 열립니다. | On |
데이터 갱신~
위젯은 처음 열릴 때 한 번, 이후 설정된 주기 (초) 마다(브라우저 탭이 가려져 있는 동안은 건너뜀) /api/aot/facility/<uuid>/runtime 를 호출해 환경 값과 액추에이터 상태를 갱신하고, 상태 스트립이 켜져 있으면 주기와 무관하게 /api/aot/facility/<uuid>/status 를 5초마다 호출합니다.
액추에이터 상태는 항상 실시간으로 읽습니다. 환경 값은 연결된 함수가 활성 상태로 사이클을 보고하는 동안에는 그 함수의 마지막 제어 사이클에서 오므로, 그 사이클만큼 최신입니다. 그런 함수가 없으면 응답을 붙잡아 두지 않고 뒤에서 만듭니다 — 대시보드를 막 열었을 때는 셀이 아직 — 일 수 있고, 다음 조회에서 채워집니다.
- 센서 바인딩이 없는 시설은
—만 표시됩니다. - 실외 값은 시설의 실외 센서·기상 입력에서 옵니다. 설정되지 않은 항목은 공유 외부 환경 컨텍스트로 채워지며, 그 컨텍스트가 10분 이내일 때만 씁니다.
시설이 없을 때~
고른 IEC 함수에 시설이 설정돼 있지 않으면 가장 최근에 수정된 시설로 대체되므로, 안내 문구는 시스템에 등록된 시설이 하나도 없을 때만 나타납니다: "시설이 선택되지 않았습니다. 다음에서 등록하세요: /geo/facility."
시설 등록 방법:
/geo/design→ 시설 모드 → 건물 폴리곤 그리기 및 저장/geo/facility→ 해당 시설 선택 → 외피 설정 → 시설 저장