콘텐츠로 이동

환경 제어 자동화~

AoT 의 env_coordinator(화면에서는 통합 환경 제어)는 한 시설의 모든 액추에이터를 하나로 조율하는 3계층 제어 시스템입니다 — 개구부, 배기·흡기팬, 난방기, 냉방기, 분무기, 차광막, 보온커튼, 보광등, CO₂ 주입기.

서로 다른 두 곳에서 정해지는 두 가지가 있고, 이 둘을 섞는 것이 가장 흔한 혼란의 원인입니다.

  • 무엇을 목표로 할지 — VPD·CO₂·DLI 등 — 는 그 시설에서 자라고 있는 구획의 것입니다. 구획에 붙은 재배 프로그램을 통해 정해집니다.
  • 어떻게 달성할지 — 어떤 설비가 있는지, 넘으면 안 되는 선은 어디인지, 목표를 얼마나 바짝 쫓을지 — 는 이 함수의 것입니다.

목표는 어디서 오는가~

계층 갖는 것 편집하는 곳
프로그램(GeoProgram) 참고 계획: 단계, 목표 항목의 어휘, 목표 곡선, 작물의 광합성 상수 프로그램 화면
구획(GeoPlot) 실제 계획: 단계 경계 날짜와 이 구획의 단계별 목표값 구획 화면(단계 일정)
env_coordinator 달성 방법: 설비 구성, 안전 한계, 우선순위, 튜닝, 응급 동작 함수 설정

구획은 고른 프로그램을 내재화합니다. 구획 화면에서 단계 목표를 고치면 그 구획의 그 항목만 덮어쓰고, 프로그램 원본과 같은 프로그램을 쓰는 다른 구획은 그대로입니다. 칸을 비우면 그 항목은 프로그램 값으로 돌아갑니다 — 되돌리기 버튼을 따로 두지 않는 이유가 이것입니다.

의도한 제약이 둘 있습니다.

  • 구획은 새 목표 항목을 만들 수 없습니다. 어휘는 프로그램의 것(target_defs)이라, 모르는 항목은 조용히 무시하지 않고 거절합니다.
  • 곡선이 걸린 항목은 숫자로 덮을 수 없습니다. 곡선이 이기고, 구획 화면에서 그 항목은 읽기 전용으로 보입니다.

코디네이터가 매 사이클 읽는 것~

쓰이는 곳
VPD 목표(숫자 또는 곡선) 1차 제어 목표
CO₂ 목표(숫자 또는 곡선) CO₂ 시비. 없으면 CO₂ 제어는 쉽니다
DLI 목표 · 일별 GDD 목표 누적 트래커
T_base GDD 적산
구획 시작일 경과 주차 — 단계형 곡선이 이것으로 진행합니다
광합성 상수(A_max, K_L, T_opt, VPD_half) Big-Leaf 모델, 그리고 K_L 에서 파생하는 광포화점

목표 항목과 제어 축은 항목 키가 아니라 물리량과 형태로 잇습니다 — 사용자가 "실내 CO₂" 라고 이름 붙인 항목도 물리량이 CO₂ 면 CO₂ 제어에 닿습니다. 물리량을 고르지 않은 항목은 어느 축에도 닿지 않고 화면에 참고 로 표시됩니다.

구획이 없을 때~

코디네이터는 멈추지 않습니다. 구획이 없거나, 프로그램이 없거나, AI 초안이 아직 검토되지 않았거나, 오늘 날짜에 해당하는 단계가 없으면 목표가 없을 뿐입니다 — 제어는 자기 유도 범위 안에서 계속 돕니다. 이것은 이미 정의된 동작입니다. 비어 있는 온실도 난방은 돌아야 합니다.

2026-09-01 부로 코디네이터에는 자기 종료일 옵션이 없습니다. 재배를 계속할지는 구획이 정합니다. 예전에는 함수에 한 번 적어 둔 날짜 때문에, 새 작물을 심은 뒤에도 시설이 계속 멈춰 있는 일이 있었습니다.

범위 안에 구획이 둘 이상일 때~

간작·혼작이 정상인 도메인이라 코디네이터는 추측하지 않습니다. 시설·구역 범위 안에 구획이 둘 이상이면 그 사실을 말하고 [이걸로] 버튼을 내놓습니다. 같은 선택이 고급 설정의 기준 구획 에 저장됩니다. 지정한 구획이 끝났거나 범위 밖으로 나가도 값을 지우지 않습니다 — 화면이 "지정한 구획이 여기 없다" 고 말하고, 선택 규칙을 다시 적용합니다.

구획에 기록된 프로그램 버전은 버전 번호를 고정할 뿐 내용을 고정하지 않습니다. 프로그램을 고치면 진행 중인 구획의 해석도 함께 바뀝니다.


VPD (수증기압 포화차)~

VPD는 식물의 증산과 수분 흡수를 결정하는 핵심 지표입니다.

VPD = SVP × (1 - RH/100)
SVP = 0.6108 × exp(17.27T / (T + 237.3))  [kPa]
범위 상태 권장 작물 단계
< 0.4 kPa 너무 낮음 — 곰팡이 위험
0.4–0.8 kPa 적정 발아기 / 이식 초기
0.8–1.2 kPa 적정 영양생장기
1.2–1.8 kPa 적정 개화·결실기
> 1.8 kPa 너무 높음 — 수분 스트레스

env_coordinator 제어 계층~

L1 — EnvTarget (목표값 설정)~

위에서 설명한 목표를 이번 사이클의 setpoint 로 푼다. Method 를 따르는 항목은 구획의 경과 주차와 시설 현지 시간대로 계산한다.

L2 — SituationReport (상황 평가)~

현재 편차, 제한 인자, 추세를 평가한다.

평가 항목 설명
편차 현재값 - 목표값
제한 인자 온도/습도/CO₂/광량 중 무엇이 목표 도달을 막고 있는가
추세 값이 목표 방향으로 이동 중인가

VPD 를 쓸 수 있을 때 온·습도는 제약으로 강등된다 — VPD 를 풀어낼 범위이자 넘지 말아야 할 선이다. 이 함수는 온도 조절기가 아니다.

L3 — Coordinator (액추에이터 명령)~

PI 제어 + slew rate 제한 + anti-windup 을 적용해 액추에이터 명령을 산출한다.

e(t) = setpoint - measurement
u(t) = Kp × e(t) + Ki × ∫e dt
slew: |Δu| ≤ slew_rate_per_cycle
output → 난방기 / 개구부 / 팬 / 분무기 / CO₂ 공급

액추에이터 도메인~

부하 분담은 도메인 안에서 일어나고, 도메인은 장치가 비슷한가가 아니라 에너지의 종착점이 같은가로 가릅니다. 설정 화면도 같은 축을 따릅니다.

도메인 장치 성질
환기 개구부, 배기팬, 흡기팬 실내를 실외 쪽으로만 민다
냉난방·가습 난방기, 냉방기, 포그 외기와 무관하게 직접 넣고 뺀다
빛과 차광 차광막, 보온커튼, 보광등 들고 나는 복사를 막는다
CO₂ CO₂ 주입기 자기 축, 겨룰 상대가 없다

도메인끼리는 서로가 하는 일을 보지 않으므로, 도메인 간 조율은 암묵적인 효과 누적이 아니라 선언된 인터록이 맡습니다(환기 참조).

천창과 측창은 다르게 움직인다~

둘 다 opening 액추에이터지만, 시설 도면은 천창(ridge)과 측창(side)을 구분하고 효과 모델이 그것을 씁니다.

형태 실내가 실외보다 더울 때 실외가 실내보다 더울 때
천창 부력이 돕는다 — 같은 면적이 열을 더 많이 뺀다 역전 — 더운 외기가 잘 안 내려온다
측창 기준 직접 유입, 그대로 가온이다

도면에 형태가 없으면 예전과 똑같이 동작합니다(보정 없음).


Function 설정~

AoT UI 에서 Function → 통합 환경 제어 로 이동합니다. 액추에이터 자체는 따로 등록하거나(액추에이터 등록), 연동 시설에서 자동으로 찾습니다.

설정 화면 읽는 법~

2026-08 에 화면을 전면 재설계했습니다. 아래 표를 읽기 전에 다섯 가지를 알아 두면 좋습니다.

맨 위에 상태 머리말이 있습니다. 시설 선택 칸 아래에서, 제어가 지금 무엇을 하고 있는지 보여 줍니다 — 현재 VPD 와 목표, 장치 종류별 개도(개구부·난방·냉방·분무·차광 …), 마지막 판단이 몇 분 전인지. 그 아래 두 줄 요약이 따르는 구획·단계와 지금 적용 중인 목표를 말합니다. 돌 수 없는 상태는 각각 다른 문장입니다 — 시설 미선택, 제어 꺼짐, 최근 판단 없음. 구획이 2주 안에 끝나면 그 한 줄이 더 붙습니다.

설정은 옵션 종류가 아니라 네 층으로 놓입니다.

무엇 표시
연결 시설, 구역 항상
약속 온·습도 범위, CO₂ 허용오차 항상
전략 환기·냉난방 협조, 야간 닫기, 분무 보호 항상(토글 또는 눈금)
튜닝 나머지 전부 [고급] 안, 그리고 접힌 [고급 설정] 묶음 안

핵심 옵션 하나가 세부를 데리고 다닙니다. 아무도 답할 수 없는 숫자("긴급 판정 배수를 3.0 으로 할까 4.0 으로 할까?")를 묻는 대신, 답할 수 있는 질문을 하고 값 여러 개를 함께 움직입니다 — 로봇청소기의 조용히/중간/강하게 와 같습니다. 그런 조작기가 셋 있습니다: 제어 성향, 환기·냉난방 협조, 분무 빈도. 단계 이름 자체는 저장하지 않습니다 — 저장되는 것은 실제 값뿐이고, 지금 어느 단계인지는 그 값들에서 되짚습니다. 어느 단계와도 안 맞으면 직접 지정 으로 보입니다.

범위는 손잡이 둘인 밴드로 묻습니다. 온도와 습도는 질문이 하나입니다 — 몇 도에서 몇 도로 기를 것인가. 넘으면 안 되는 선은 거기서 고정 여유(±5 °C, ±5 %RH)로 파생합니다. 대가 하나는 의도한 것입니다: 하드 한계가 유도 범위보다 좁을 수 없으므로 "12~32 °C 에서 기르되 30 °C 는 넘기지 마라" 는 표현할 수 없습니다. 그 조합이 바로 난방기와 냉방기를 동시에 100 % 로 맞서게 했던 설정입니다.

[고급] 스위치 하나가 모든 숫자 칸을 엽니다. 눈금마다 숫자 칸이 함께 붙고, 고급 전용 행이 전부 드러나며, 접힌 묶음도 한 번에 펼쳐집니다. 이 스위치는 브라우저에만 있습니다 — 설정으로 저장하지 않으므로, 같은 함수를 두 사람이 다르게 보는 일이 없습니다. 상위 토글이 꺼진 설정은 비활성이 아니라 감춰집니다. 그래서 저장된 값이 계속 제출되고, 토글을 껐다 켜도 사라지지 않습니다.

어떤 설정은 특정 조건에서만 읽힙니다 — 사용자 지정 구동 주기는 프로파일이 직접 지정 일 때만, 야간 시각 칸은 야간 기준이 고정 시각일 때만. 입력했는데 안 쓰이는 값이 있으면 화면이 그것을 알려 줍니다. 그러지 않으면 조용히 아무 일도 안 하기 때문입니다.

명령~

명령 동작
액추에이터 재로드 Actions 표를 다시 읽고 액추에이터 프로필을 재구성합니다.
지금 실행 현재 센서값으로 조율 사이클을 즉시 1회 실행합니다.
긴급 정지 모든 액추에이터를 안전 기본 위치로 보내고 60초간 제어를 정지합니다.

시설 설정~

항목 기본값 설명
연동 시설 (없음) 이 코디네이터가 맡을 시설. 액추에이터와 센서가 여기서 옵니다 — 외피, 측창·천창, 커튼, 팬, 실내외 센서. 방위·면적·열관류율 같은 GIS 값이 각 액추에이터 프로필에 붙어 풍향과 시설 형상을 계산에 쓸 수 있습니다. 이것을 정하지 않으면 나머지 설정은 대상이 없습니다.
구역(bay) 범위 (선택) (비움) 시설의 한 동만 맡게 합니다. 그 동 안의 센서·액추에이터만 쓰고, 시설 부피·면적도 그 동 몫으로 줄여 잡습니다. 비우면 시설 전체이고, 여러 동을 독립 제어하려면 동마다 코디네이터를 만듭니다. 연동 시설의 구역 목록에서 고르는 드롭다운입니다 — 시설에 더 이상 없는 저장값은 조용히 지우지 않고 표시를 붙여 남깁니다.

제어를 돌리는 시간대~

토글을 켜야 나머지가 나옵니다. 이것은 시간대별 제어가 아니라 스위치입니다. 창 밖 시간에는 난방·냉방을 포함해 제어가 통째로 멈춥니다. 안전 한계는 그래도 작동합니다.

항목 기본값 설명
시간창 사용 꺼짐 켜면 시작~종료 시각 사이에만 제어가 돕니다.
시작 시각 (HH:MM) 06:00 매일 코디네이터가 일을 시작하는 시각.
종료 시각 (HH:MM) 20:00 멈추는 시각. 그 순간 각 장치가 무엇을 할지는 그 장치의 Action 에서 정합니다.
광주기 Method (없음) 고정 시각 대신 일장 곡선으로 창을 정합니다. 주의: 일장이 짧으면 코디네이터도 그 시간만 돌아서 밤새 난방이 되지 않습니다.
광주기 기준 시각 (HH:MM) 12:00 태양남중에 해당하는 시각 — 창이 이 시각을 중심으로 잡힙니다.

목표와 성향~

항목 기본값 설명
온도 범위 12–32 °C 기를 범위. 한계를 넘으면 잘못된 방향으로 미는 것을 멈춥니다 — 너무 더우면 난방을 끄고 차광막을 치고, 너무 추우면 냉방을 끄고 개구부·보온커튼을 닫습니다. 무엇도 최대로 몰아붙이지 않습니다.
습도 범위 40–85 % 습도도 같은 규칙 — 너무 습하면 분무를 끄고, 너무 건조하면 배기팬을 끕니다.
CO₂ 허용오차 (ppm) 100 CO₂ setpoint 주변 데드밴드 반폭. 일반적으로 50–150 ppm.
제어 성향 (직접 지정) 목표를 얼마나 바짝 쫓을지. 한 칸을 고르면 사이클 주기·환기창 구동 프로파일·VPD 허용오차·긴급 판정 둘이 함께 움직입니다. 새로 추가한 함수의 출하값은 어느 단계와도 맞지 않아, 한 칸을 고르기 전까지는 직접 지정 으로 보입니다.

[고급] 을 켜면 각 범위 밴드가 뒤에 있는 숫자 넷(유도 T 하한/상한, 최저/최고 온도, 그리고 습도의 짝)을 함께 보이고, 제어 성향은 멤버를 보입니다.

멤버 느긋하게 표준 민감하게
주기 (초) 600 120 60
환기창 구동 프로파일 완만 (600초) 표준 (180초) 민감 (60초)
VPD 허용오차 (kPa) 0.15 0.1 0.05
긴급 편차 임계 (× 허용오차) 4.0 3.0 2.0
긴급 변화율 임계 (°C / 10분) 3.0 2.0 1.5

같은 자리에 있지만 단계가 정하지 않는 멤버가 둘 더 있습니다. 같은 축의 미세 조정이기 때문입니다: 사용자 지정 구동 주기(초) — 프로파일이 직접 지정 일 때만 쓰입니다 — 와 긴급 최소 간격(초), 기본 60. 뒤엣것은 긴급 상황에서도 두 번의 개구부 명령 사이에 두는 하한입니다.

구동 프로파일은 측창·천창이 실제로 움직이는 간격만 정합니다. 감지와 계산은 매 사이클 주기마다 그대로 돌고, 커튼·차광막은 한 번에 열고 닫으므로 해당이 없으며, 급변하는 날씨와 안전 게이트는 이 값과 무관하게 즉시 창을 움직입니다.

환기~

항목 기본값 설명
환기·냉난방 협조 고성능 환기와 냉난방이 서로를 방해하지 않게 합니다. 세 단계는 아래에 설명합니다.
밤에는 닫기 꺼짐 밤새 창을 닫고 냉난방·제습이 부하를 지게 합니다. 개구부만 파킹하고 냉난방·제습은 그대로 돕니다.
강풍 임계 (m/s) 12 이 풍속을 넘으면 개구부를 강제로 닫습니다. [고급]

환기·냉난방 협조는 토글 셋을 한 번에 움직입니다.

단계 환기로 못 갈 때 창 닫기 환기로 닿으면 냉난방 쉬기 냉난방 가동 중 창 닫아 두기
고성능 (기본)
표준
에너지 절약
  • 환기로 못 갈 때 창 닫기 — 환기는 실내를 실외 쪽으로만 밉니다. 목표가 실외의 반대편에 있으면 아무리 열어도 멀어질 뿐입니다. 대표적인 경우가 야간 제습으로, 실외가 실내보다 습할 때입니다. 켜 두면 개구부와 배기·흡기팬이 밤새 반쯤 열린 채 있는 대신 닫힌 채 파킹합니다.
  • 환기로 닿으면 냉난방 쉬기 — 실외 공기가 이미 목표 너머에 있으면 환기만으로 닿을 수 있고, 그때 냉난방을 함께 돌리는 것은 바깥 공기가 공짜로 할 일을 돈 주고 하는 것입니다. 조건 셋을 모두 만족해야 합니다: 실외가 목표를 허용오차보다 더 지나 있고, 제어 대상 변수가 전부 그러하며, 환기에 여력이 남아 있어야 합니다(직전 사이클의 최대 개도가 90 % 미만). 15분이 지나도 목표에 못 닿으면 전부 냉난방에 넘깁니다 — 예측이 틀렸다는 뜻이기 때문입니다.
  • 냉난방 가동 중 창 닫아 두기 — 돌고 있는 기계 옆에서 환기하면 그 열이나 냉기를 그대로 밖으로 버립니다. 다만 실외가 목표 쪽으로 도와줄 수 있는 계절에는 그 도움까지 버리게 됩니다.

가동 감지에는 근거가 필요하고, 근거는 둘뿐입니다 — 이 코디네이터가 그 기계를 직접 명령하거나, 기계가 돌 때 값이 오르는 측정을 신호 칸에 지정하거나. 실내 온도로 추측하지 않습니다. 냉방기가 없는 온실의 실측 30일로 검증한 결과, 일사 300 W/m² 이상에서 실내외 온도차의 중앙값은 +0.03 °C, 최솟값은 −4.22 °C 였습니다. "실내가 실외보다 서늘하면 냉방 중" 이라는 판정은 1.5 °C 여유를 두어도 주간 표본의 13 % 에서 틀렸습니다.

항목 (인터록을 켜면 나옵니다) 기본값 설명
냉난방 가동 감지 신호 (없음) 이 코디네이터가 직접 켜지 않는 기계 전용입니다. 그 기계가 돌 때 값이 오르는 측정이면 무엇이든 됩니다 — 전력을 보고하는 스마트 플러그, 전류계, 보조 접점. 코디네이터가 직접 명령하는 기계면 비워 둡니다.
가동 신호 임계 0.5 이 값 이상이면 가동 중으로 봅니다. on/off 접점이면 0.5 그대로 두고, 와트·암페어면 대기전력보다 높게 잡습니다.

신호에 자기 유효시간이 없으면 그 측정의 주기(×2, 하한 300초)로 판정합니다. 만료된 신호는 가동 중이 아님 으로 보고, 그 사실을 로그에 남깁니다.

야간 닫기가 있는 이유는 밤에 습도가 오르고 이슬이 맺히기 때문입니다. 해질 무렵 쓸모 있어 보이던 개구도 아침까지 작물을 젖은 채로 둘 수 있습니다. 하위 설정은 토글을 켜야 나옵니다.

항목 (밤에는 닫기를 켜면 나옵니다) 기본값 설명
야간 기준 일몰~일출 밤을 일몰~일출로 잴지, 고정 시각으로 잴지.
일몰 전 닫기 (분) 0 일몰 이 분 전부터 닫기 시작합니다. 음수는 잘라냅니다 — 일몰 뒤에 닫히는 지연이야말로 이 옵션이 없애려는 것입니다.
야간 시작 / 종료 (HH:MM) 18:00 / 06:00 야간 기준이 고정 시각일 때만 쓰입니다.

세 가지가 보장됩니다. 안전 게이트가 이깁니다(여름밤 고온이면 창은 그래도 열립니다), 온·습도 하드 임계를 넘으면 파킹이 풀리고, 태양시를 구할 좌표가 없으면 아예 파킹하지 않습니다. 시각은 서버가 아니라 시설 현지 시간대로 읽습니다. 시설 팝업에서 이 옵션으로 닫힌 장치는 밤이라 닫아 둠 — 냉난방이 대신합니다 로 표시되며, 지금 이 장치가 바꿀 수 있는 것이 없음 과 구분됩니다.

냉난방과 분무~

항목 기본값 설명
습윤형 분무를 가습에 쓰기 켜짐 잎을 적시는 분무기를 습도에도 씁니다. 같은 노즐이 관수 설비를 겸하면 끕니다 — 관수용으로 고른 스프링클러는 짧게 한 번만 틀어도 잎에 물막을 남깁니다.
일소·저녁 보호 사용 꺼짐 강한 빛에서 습윤형 분무를 막고(물방울이 렌즈가 되어 볕을 모읍니다), 설정하면 일몰 전에도 막습니다. 분무를 얼마나 자주 하는가와는 별개입니다.
분무 빈도 자주 분무가 얼마나 자주 도는가 — 1회 작동 시간과 다음까지의 간격.

분무 밸브는 거의 전부 on/off 라 물살을 줄일 방법이 없습니다. 조절할 수 있는 것은 한 번에 몇 초 켜느냐와 다음까지 얼마나 기다리느냐뿐이고, 이 눈금이 그것을 정합니다.

단계 1회 최대 분무 시간 (초) 강제 건조 간격 (초)
드물게 5 1200
보통 10 900
자주 20 600
매우 자주 30 450

일소 보호는 빈도와 별개의 결정입니다 — 한때 둘을 묶어 두었더니 "자주 뿌리되 강한 볕에는 잠가 달라" 를 표현할 방법이 없어졌습니다.

항목 (보호를 켜면 나옵니다) 기본값 설명
일사량 기준 분무 150–250 W/m² 손잡이 둘인 밴드입니다. 아래 값보다 어두우면 분무가 자유롭게 돌고, 위 값보다 밝으면 멈추며, 사이에서는 선형으로 줄어듭니다. 둘 사이를 벌려 두는 것은 구름이 지날 때 분무가 켜졌다 꺼졌다 하지 않게 하려는 것입니다. 잎을 적시는 분무에만 적용됩니다 — 안개형은 강한 볕에도 돕니다. 판정은 추정 실내 광량이라 차광막을 치면 잠금이 완화됩니다.
일몰 전 분무 허용 켜짐 끄면 밤새 잎이 마른 채로 남습니다. 엽면 습윤이 길수록 잿빛곰팡이·노균병 위험이 커집니다.
일몰 몇 분 전에 중단 (분) 120 일몰 이 분 전에 분무를 멈춥니다.
분무 수원 지하수(무처리) 처리 안 한 지하수는 대개 경도가 높고 찹니다 — 마르는 물방울이 미네랄 자국을 남기고 볕 받는 잎에 냉해를 줄 수 있습니다. 이것을 고르면 잠금·해제 임계가 자동으로 내려갑니다(각각 최대 150/100 W/m²).

보호를 꺼도 습윤형 분무기는 연속 변조가 아니라 펄스로 도징됩니다 — 기본값으로 1회 최대 30초, 최소 180초 휴지 — 연속 변조는 잎이 마를 틈을 주지 않기 때문입니다.

빛과 차광~

항목 기본값 설명
차광과 보광 0–800 W/m² 안에 머무르라는 범위가 아니라 기준선 둘입니다. 밴드보다 어두우면 보광등이 켜지고 차광막이 열립니다. 밝으면 차광막이 닫힙니다. 밴드 안에서는 아무 일도 일어나지 않습니다.

양 끝을 각각 끌 수 있고, "끔" 의 뜻은 두 끝에서 반대입니다. 아래 손잡이가 0 이면 보광 안 함, 위 손잡이를 끄면 차광 안 함 입니다. 시설에 차광막이나 보광등이 등록돼 있지 않으면, 아무 일도 못 하는 손잡이를 내놓는 대신 화면이 그렇게 말합니다.

실제 값은 최소 광량 임계(보광)(기본 0)와 최대 광량 임계(기본 800)이고, 둘 다 [고급] 에서 보입니다.

관련된 두 물성은 이 화면에 없습니다.

  • 차광막 투과율은 시설의 것이고, 시설 편집기의 차광 커튼 아래에 있습니다. 실내 광센서가 없을 때만 쓰입니다 — 그때는 실외 일사와 차광 개도로 실내 광량을 어림합니다. 값이 없거나 범위 밖이면 0.50 으로 돌아가고, 차광막이 없다고 선언한 시설에서는 1.0 입니다. 천이 다른 차광막 하나는 자기 Action 에서 따로 지정할 수 있습니다.
  • 광포화점은 차광 임계가 아니라 프로그램의 작물 K_L 에서 파생합니다. 둘이 같은 칸이던 시절에는 차광을 일찍 하려고 임계를 낮추는 순간 광합성 모델이 "빛은 이미 충분하다" 로 판정했습니다 — light_max=250 인 코디네이터 둘이 실측 일사 542·650 W/m² 환경에서 광 제한을 한 번도 못 봤습니다. K_L 이 없으면 시스템 기본 600 W/m² 를 씁니다.

고급 설정~

기본으로 접혀 있고, 재배자가 아니라 이 함수를 시험하는 사람을 위한 묶음입니다.

항목 기본값 설명
센서 최대 경과시간 (초) 0 이보다 오래된 센서값은 버립니다. 0 은 '제한 없음' 이 아니라 '안 정했다' 입니다 — 그때는 센서마다 자기 갱신 주기(×2)로 판정합니다. 공급원의 주기보다 짧은 고정값은 만족될 수 없습니다: 300초마다 값을 내는 기상대를 120초 상한으로 재던 설치는 하루 내내 유효 채널이 0 이었습니다.
광합성 중심 제어 사용 꺼짐 매 사이클 Big-Leaf 모델이 지금 무엇이 발목을 잡는지(빛·CO₂·온도·VPD) 가려내고 그 변수의 우선순위를 높입니다. 광센서가 필요하고, 작물 상수는 구획의 프로그램에서 옵니다.
기준 구획 (선택) (비움) 범위 안에서 둘 이상이 자랄 때 이 코디네이터가 따를 구획. 하나뿐이면 비워 둡니다.
T 가중치 (0–1) 0.6 VPD 조정 중 온도로 수행할 비율(나머지는 습도).
VPD 우선도 1.2 처리 순서 가중치 — 높을수록 먼저 처리합니다.
CO₂ 우선도 0.8 CO₂ 의 같은 가중치. 시비는 부차적이라 VPD 보다 낮습니다.
DLI / GDD 트래커 사용 꺼짐 일적산광량과 적산온도를 추적하고 시설 현지 자정에 롤오버합니다. 광량은 센서 단위에 따라 PPFD 로 환산합니다. 목표는 구획의 프로그램에서 오고, DLI 에는 광센서가 필요합니다.

효과 캘리브레이션~

항목 기본값 설명
효과 엔진 Legacy Legacy: 내장 K_* 상수(기본, 안전). Shadow: 그레이박스 모델을 나란히 돌려 기록만 하고 제어는 그대로. Grey-box: 물리 모델이 제어(예보가 있으면 MPC 선행 포함). 권장 순서는 Shadow 다음 Grey-box. 시험 중이 아니면 바꿀 이유가 없습니다.
RLS 캘리브레이션 사용 꺼짐 센서 반응에서 액추에이터별 효과 계수(K_*)를 학습합니다. 수렴에 며칠이 걸리고, 그때까지는 내장 기본값으로 돕니다.
능동 프로빙 사용 꺼짐 캘리브레이션 식별성을 높이려고 주기적으로 한 액추에이터를 ±10 % 흔듭니다. 부하가 낮고 안전 게이트가 없을 때만 발동하며, RLS 캘리브레이션이 필요합니다.
프로빙 간격 (초) 3600 프로빙 사이 최소 간격. 단계: 자주(1800) / 표준(3600) / 드물게(10800).

예보 피드포워드~

항목 기본값 설명
예보 피드포워드 사용 꺼짐 단기 기상 예보로 온·습도 setpoint 를 미리 옮기고, 악천후가 닿기 전에 환기를 억제합니다.
예보 선행 시간 (시간) 3 몇 시간 앞까지 볼지. 단계: 짧게(1) / 표준(3) / 길게(6). 길수록 일찍 알지만 과보정할 수 있습니다.

디버그 로깅은 더 이상 별도 옵션이 아닙니다. 프레임워크의 디버그 스위치와 같은 스위치가 둘이던 상태였고, 이 옵션이 감싸던 것은 거의 전부 DEBUG 레벨이라 혼자서는 아무것도 출력하지 않았습니다. 이제 함수 고급 설정의 스위치 하나가 둘 다 합니다. 중요 사건 — 안전 게이트, 디스패치 실패, 런타임 상태 오류 — 은 이 값과 무관하게 항상 기록됩니다.


액추에이터 등록~

연동 시설 도면에 그려진 액추에이터는 자동으로 찾습니다. 그 밖의 장치는 이 함수에 환경 제어(Environment Control) 액션으로 등록하고, 장치마다 액션을 하나씩 추가합니다. 수동 액션은 시설에서 찾은 목록과 병합됩니다.

액션 옵션 기본값 설명
Output 채널 제어할 Output 채널.
액추에이터 종류 개구부 · 냉방기 · 난방기 · 분무기/가습기 · CO₂ 주입기 · 차광막 · 보온커튼 · 보광등 · 유동팬 · 배기팬 · 흡기팬.
비용 지수 5.0 낮을수록 우선(1 = 공짜인 자연 환기, 10 = 비싼 장치).
시간창 종료 시 동작 아무것도 안 함 제어 시간창이 끝날 때 이 액추에이터가 할 일: 아무것도 안 함 / 끄기 / 켜기 / 개도 % 지정(개구부 전용).
종료 개도 % 0 그 순간의 목표 개도(개구부 전용).
차광포 투과율 개별 지정 (0–1, 차광막 전용) 0 이 차광막의 천이 다른 것과 다를 때만. 0 으로 두면 연동 시설 값을 씁니다.
효과 계수 개별 지정 (K_*) 0 0 = 기본값 사용. 실측 데이터로 보정할 때만 입력합니다.
전 행정 시간 (초) 0 이 액추에이터가 0→100 % 를 이동하는 데 걸리는 초. 사이클당 명령 변화량을 제한해 물리적으로 불가능한 명령을 보내지 않게 합니다. 10분 걸리는 환기창 모터면 600.
최소 반복 간격 (초) 0 목표값이 그대로여도 같은 액추에이터에 명령을 반복하는 최소 간격. 0 = 시스템 기본(600초 워치독). 느린 전동 액추에이터는 릴레이 수명을 위해 늘립니다.

디바이스 타입별 자동 변환~

명령은 언제나 0–100 % 로 산출됩니다. 어댑터는 Output 모듈의 메타데이터에서 정해지고 별도 설정이 없습니다.

Output 타입 어댑터 변환
페어(정/역) 액추에이터 모듈 Paired 정/역 페어 변환, 모듈 내부에서 처리
vol / volume (용량형 펌프) Volumetric vol_ml = flow_lpm × on_sec / 60 × 1000
pwm PWM duty = pct
on_off 릴레이 시간 비례 on_sec = cycle_sec × pct/100, 5 % 미만은 OFF
그 밖 Value 0–100 % 직접 전달(DAC, 스텝모터)
명령 (%) on/off 릴레이 (60초 사이클) PWM 용량형 펌프 (1.5 L/min)
0 OFF duty 0 OFF
30 ON 18초 duty 30 450 mL/사이클
100 ON 60초 (상시) duty 100 1,500 mL/사이클

습윤형 분무기는 여기에 펄스 도징이 한 겹 더 씌워집니다 — 1회 분무를 최대 작동 시간에서 끊고, 건조 간격이 지나기 전까지는 아무 명령이 와도 뿌리지 않습니다.

관수 유량은 시설 도면에서 집계합니다 — 한 레이어에 딸린 모든 emitter 유량을 합해 그 액추에이터의 flow_lpm 으로 두고, 용량형 어댑터와 포그 효과 모델이 그 값을 그대로 씁니다. 없을 때의 우선순위는 액추에이터별 유량 → 시설 전체 합계 → 1.0 L/min 입니다.

안전 기본 위치~

각 액추에이터에는 안전 게이트 발동, 긴급 정지, 외부 force_safe_state() 호출 시 이동할 안전 위치가 있습니다. 시설에서 찾은 액추에이터는 장치 종류를 따릅니다 — 보온커튼과 차광막은 100 % 로 파킹하고, 나머지는 0(끔)입니다.


Method (제어 곡선)~

Method 는 setpoint 가 시간에 따라 어떻게 변하는지 정의합니다. Method 는 이 함수가 아니라 프로그램의 목표 항목에 붙습니다 — 곡선이 걸린 항목은 구획 화면에 곡선을 따름 으로 표시되고 숫자로 덮을 수 없습니다.

  • Daily — 시각(HH:MM)별 setpoint
  • Duration — 시작 후 경과 시간(h)별
  • Daily Bezier — 부드러운 일주 곡선
  • Repeating — 반복 패턴

생육 주차로 진행하는 곡선은 구획 시작일을 기준으로 계산합니다. 날짜만 있는 값은 시설 현지 시간대의 자정으로 읽고, 주차는 구획 화면·구획 일지와 같은 계산을 씁니다.

작물 단계 스케줄 예시(토마토):

일차 VPD 목표 CO₂ 목표
파종~7일 0.6 kPa 800 ppm
8~21일 0.8 kPa 900 ppm
22~42일 1.0 kPa 1000 ppm
43일~ 1.3 kPa 1000 ppm

SEED: 로 시작하는 Method 는 시드 프리셋이라 읽기 전용입니다. 편집하려면 복제한 뒤 수정하세요.


안전 게이트~

안전은 L1~L3 조율 알고리즘 밖에서 돕니다 — 매 사이클 L1~L3 앞에서 평가하는 Pre-Gate 와, L3 결과를 내보내기 직전에 검증하는 Post-Gate 입니다. 한 번 발동한 Pre-Gate 는 마지막 발동 후 최소 300초 동안 유지됩니다(빠른 on/off 반복 방지).

Pre-Gate (L1~L3 진입 전 평가)~

게이트 발동 조건 동작
강우 강우량 ≥ 0.5 mm/hr (고정, 사용자 설정 불가) 측창·천창을 닫습니다. 커튼·차광막은 실내 설비라 건드리지 않습니다.
강풍 풍속 ≥ 강풍 임계 옵션(기본 12 m/s) 개구부를 닫습니다. 강풍이 유일한 활성 게이트이고 풍향과 개구부 방위를 둘 다 알면, 풍상측(±60° 이내) 개구부만 강제로 닫고 풍하측은 정상 제어를 이어 갑니다.
폭염 비상 실외 ≥ 45 °C 그리고 실내 ≥ 35 °C (둘 다 고정) 개구부 전개, 차광막 폐쇄, 냉방기 100 % 강제.
한파 비상 실외 ≤ −5 °C 그리고 실내 ≤ 5 °C (둘 다 고정) 개구부 폐쇄, 보온커튼 폐쇄, 난방기 100 % 강제.
내부 센서 만료 120초(고정) 넘게 실내 신선값 없음 모든 액추에이터가 안전 기본 위치로 — 실내 데이터 없이는 제어가 불가능합니다.
외부 센서 만료 (단독) 300초 넘게 실외 신선값 없고 다른 게이트는 비활성 부분 게이트: 개구부·차광막만 보수적으로 닫고, 난방기·냉방기·분무기·CO₂·커튼은 정상 L1~L3 제어를 이어 갑니다.
분무 잠금 강한 빛, 또는 저녁 차단 시각 (일소·저녁 보호가 켜져 있을 때) 습윤형 분무기만 잠급니다. 국소 잠금이라 나머지 제어를 얼리지 않고 300초 유지도 하지 않습니다.

강우·폭염·한파 임계는 코드에 고정돼 있고, 함수 옵션으로 노출된 것은 강풍 임계 하나뿐입니다. 여러 게이트가 동시에 활성일 수 있으며(예: 강우 + 강풍), 그때 개구부는 풍향과 무관하게 무조건 닫힙니다.

게이트가 걸린 사이클도 사이클입니다. 게이트가 사이클을 일찍 끝내면 축소 요약을 남기고 사이클 도장을 찍습니다. 그래서 시설 위젯이 무슨 일이 있었는지 계속 보여 주고, 코디네이터가 무응답인 것처럼 보고하지 않습니다. 축소 요약은 이번 사이클에 계산하지 않은 환경 값을 일부러 싣지 않고, 게이트가 실제로 강제한 장치만 담습니다 — 건드리지 않은 장치는 0 % 가 아니라 명령 자체가 없습니다.

Post-Gate (L3 이후, 디스패치 직전 검증)~

검증 동작
비유한 명령(NaN/Inf) 해당 액추에이터를 안전 기본 위치로 되돌립니다.
범위 초과 명령 [0, 100] 으로 클램프합니다.
Manual Lock 활성 잠긴 값으로 덮어씁니다.
냉방기와 난방기 동시 ON 허용하지 않습니다 — 비용 지수가 낮은 쪽만 남기고 다른 쪽을 0 으로 강제합니다.

긴급 정지와 안전 상태~

진입점 설명
Function Command → 긴급 정지 화면 버튼.
Conditional / Trigger → force_safe_state 외부 자동화에서 즉시 진입.
RPC output_off 우회 경로 — 개별 Output 하나만 정지합니다.

긴급 정지 후 60초 동안 다음 사이클이 지연됩니다. 그 직후 액추에이터가 움직이지 않는 것은 고장이 아니라 이 지연입니다.


트러블슈팅~

증상 점검 항목
화면에 목표가 없다 이 시설·구역에서 자라는 구획이 있는지, 그 구획에 프로그램이 있는지, 그 프로그램이 검토됐는지. 하나라도 없으면 코디네이터는 유도 범위로만 돕니다 — 고장이 아니라 정상입니다.
목표는 있는데 한 축이 무시된다 그 목표 항목에 물리량이 지정되지 않았을 수 있습니다(그러면 참고 일 뿐입니다). 곡선이 걸린 항목은 구획에 적은 숫자를 무시합니다.
액추에이터가 작동하지 않는다 액션이 등록됐는지, Output 이 활성인지. 액션이나 시설을 바꿨으면 액추에이터 재로드 를 실행합니다.
on/off 릴레이가 너무 짧게 켜진다 명령값이 5 % 미만일 가능성이 큽니다 — 시간 비례 어댑터가 그 아래에서는 끕니다.
펌프가 항상 1.0 L/min 으로 계산된다 시설의 emitter 유량이 0 이 아닌지, 관수 레이어가 그 펌프 Output 을 가리키는지 확인합니다.
강풍에 환기창이 닫히지 않는다 강풍 임계와 시설의 실외 풍속 센서 바인딩을 확인합니다.
밤에 창이 계속 닫혀 있다 밤에는 닫기 를 켰다면 정상입니다 — 시설 팝업이 밤이라 닫아 둠 이라고 말합니다. 온·습도 하드 임계와 안전 게이트는 그래도 파킹을 풉니다.
실외값이 없다고 나온다 센서 최대 경과시간이 공급원의 주기보다 짧을 수 있습니다. 0 으로 두어 센서마다 자기 주기로 판정하게 하세요.
난방기와 냉방기가 함께 돌았다 Post-Gate 가 금지합니다. 예전 설정에서 유도 범위가 하드 임계보다 넓으면, 저장하는 자리에서 막지 않고 경고합니다.
설정한 값이 무시되는 것 같다 조건부 옵션일 수 있습니다 — 사용자 지정 구동 주기는 프로파일이 직접 지정 일 때만, 야간 시각 칸은 야간 기준이 고정 시각일 때만 쓰입니다. 입력했는데 안 쓰이는 값은 화면이 알려 줍니다.
시설 변경이 반영되지 않는다 액추에이터 재로드 를 실행하거나, 함수를 비활성화했다 활성화합니다.
워치독이 장시간 정지를 보고한다 의도된 정지 — 시간창 밖이거나 등록된 액추에이터가 없는 경우 — 는 고장이 아니라 정지로 보고합니다. 진짜 정지는 그대로 경고합니다.

AI와의 연동~

AI 에이전트는 analyze_control_performance 로 제어 품질을 진단합니다.

vpd_rmse         → VPD 추종 오차 (낮을수록 좋음)
oscillation_index → 제어 진동 지수 (낮을수록 안정)
assessment       → "good" / "moderate" / "poor"

진단 결과를 바탕으로 suggest_setpoint_adjustment 가 목표 조정을 제안합니다. 제안은 조언일 뿐이고, 목표 자체는 구획의 단계 계획에 있으므로 적용하려면 구획 화면에서 그 단계 목표를 고치거나, Method 곡선을 쓰는 목표라면 사용자 승인 후 update_method_point 로 해당 제어점을 바꿉니다.