# HuevenEco DL 각실제어 대시보드 ↔ ERV 메인보드 통신 프로토콜 (Rev2.0 고정패킷) - 물리계층 : RS-485 (또는 USB-Serial), **115200 bps, 8 Data, None Parity, 1 Stop (N81)** - 역할 : PC 대시보드(Host) ↔ ERV 메인보드(Main Board) - **Rev2.0 변경점** : 가변 길이(`LEN` 필드) 프레임을 폐기하고 **모든 프레임을 244byte 고정**으로 통일. 파서는 "STX 탐색 → 정해진 바이트 수만 읽기 → CRC 검증"으로 단순화된다. CMD 의미·STATUS 레이아웃·CRC 방식은 종전과 동일. --- ## 1. 공통 프레임 (244byte 고정) ``` +------+------+------------------+--------+--------+ | STX | CMD | DATA[240] | CRC_L | CRC_H | +------+------+------------------+--------+--------+ 0xAA 1B 240B 고정 16-bit CRC ``` | 필드 | 크기 | 설명 | |----------|------|-------------------------------------------------------------| | STX | 1 | 고정 `0xAA` | | CMD | 1 | 명령/응답 코드 (2장) | | DATA | 240 | **고정 240byte.** PC→ERV 제어는 앞쪽에 인자 + 나머지 `0` 패딩, ERV→PC 는 STATUS/ACK 데이터 | | CRC | 2 | **CRC-16/MODBUS** (poly 0xA001, init 0xFFFF), **CMD~DATA(241byte)**, **리틀엔디안** | - **LEN 필드 없음.** 모든 프레임은 정확히 `1+1+240+2 = 244byte`. - 멀티바이트 수치는 모두 **빅엔디안(상위 바이트 먼저)** 으로 표기한다. (CRC만 리틀엔디안) - 프레임 동기 : STX(0xAA) 탐색 후 고정 길이로 수신, CRC 로 검증. 바이트 공백(예 60ms) 발생 시 파서를 STX 탐색으로 리셋해 재동기. --- ## 2. 명령 코드 (CMD) DATA 앞쪽에 아래 인자를 싣고 나머지는 `0` 으로 패딩한다. ### 2.1 PC → ERV (제어) | CMD | 이름 | DATA 앞쪽 인자 | 설명 | |------|-----------------|-------------------------------------------|-----------------------------------| | 0x01 | CTRL_POWER | `[onoff]` | 전원 0=OFF / 1=ON | | 0x02 | CTRL_RUNMODE | `[mode]` | 운전모드 (3.1 참조) | | 0x03 | CTRL_FAN | `[speed]` | 풍량 0~4 (자동모드에서는 무시) | | 0x04 | CTRL_SUBMODE | `[type][onoff]` | 부가모드 토글 (3.2 참조) | | 0x05 | CTRL_HOOD | `[onoff]` | 연동후드 0=OFF / 1=ON | | 0x06 | CTRL_HYST_PRESET| `[preset]` | 히스테리시스 프리셋 0=ECO/1=NORMAL/2=TURBO | | 0x07 | CTRL_HYST_VALUE | `[preset][pm25(2)][pm10(2)][voc(2)][co2(2)]` | 프리셋별 히스(하강) 데드밴드 설정 (값 BE) | | 0x08 | CTRL_DAMPER | `[room][type][onoff]` | 각실 댐퍼 type 0=급기(SA)/1=배기(EA), 0=닫힘 / 1=열림 | | 0x09 | CTRL_LED | `[room][dim]` | 각실 LED 디밍 0~9 | | 0x0A | REQ_STATUS | (없음, 전부 0) | 상태 1회 즉시 요청 | | 0x0B | CTRL_RESET | `[onoff]` | ERV 리셋 토글 0/1 | | 0x0C | CTRL_VSP | `[group][index][sa(2)][ea(2)]` | 풍량 VSP 값 설정 (3.5 참조, sa/ea BE) | | 0x0D | CTRL_HYST_THR | `[preset][pollutant][L1(2)][L2(2)][L3(2)][L4(2)]` | 오염단계 임계 설정 (pollutant 0=CO2/1=PM2.5/2=PM10/3=VOC, 값 BE) | | 0x0E | CTRL_RESERVE | `[hours]` | (꺼짐)예약 0~8시간(0=해제) | - `room` : 1=거실, 2=침실1, 3=침실2, 4=침실3 ### 2.2 ERV → PC (상태/응답) | CMD | 이름 | DATA | 설명 | |------|-----------|--------------------|---------------------------------------------| | 0x81 | STATUS | 240byte (4장 참조) | 전체 상태 스냅샷 (주기 송신 + REQ_STATUS 응답) | | 0x82 | ACK | `[echoCmd][result]` + 0패딩 | 제어 명령 수신 응답 result 0=OK / 1=ERR | --- ## 3. 값 정의 ### 3.1 운전모드 (RunMode) | 코드 | 의미 | 펌웨어 매핑 | |------|--------|----------------------------| | 0x00 | OFF | Power_On = 0 | | 0x01 | 환기 | MODE_VENTILATION (0) | | 0x02 | 자동 | MODE_AUTO (1) | | 0x03 | 공청 | MODE_AIRCLEAN (2) | | 0x04 | 바이패스 | MODE_BYPASS (3) | ### 3.2 부가모드 (SubMode) `CTRL_SUBMODE` 의 `type` : | type | 의미 | 펌웨어 매핑 | |------|------------|----------------------| | 0x01 | 스마트수면 | Ext_Run_Mode = 4 | | 0x02 | 쾌적조리 | Hood_YeunDong_Enable | | 0x03 | 안심회복 | Ext_Run_Mode = 1 | STATUS 의 `subMode` 는 비트맵 : bit0=스마트수면, bit1=쾌적조리, bit2=안심회복 ### 3.3 공기질 상태 (AirQuality) | 코드 | 등급 | 색상 | |------|-----------|--------| | 0x01 | 매우나쁨 | 빨강 | | 0x02 | 나쁨 | 주황 | | 0x03 | 보통 | 초록 | | 0x04 | 좋음 | 파랑 | ### 3.4 자동운전 상태 (AutoState) | 코드 | 의미 | |------|--------| | 0x00 | 분산 | | 0x01 | 집중 | ### 3.5 풍량 VSP (CTRL_VSP 0x0C / STATUS VSP 블록) 급기(SA)/배기(EA) 풍량 설정값. `CTRL_VSP` 로 한 엔트리씩 설정, STATUS 로 전체 표시. - `group` : `0`=환기(Vent), `1`=바이패스(Bypass), `2`=공청(AirClean) - `index` : 환기/공청 `1~4`, 바이패스 `1` - `sa`,`ea` : 각 **u16 빅엔디안** **STATUS VSP 9 엔트리 순서** (각 SA,EA): `환기1, 환기2, 환기3, 환기4, 바이패스, 공청1, 공청2, 공청3, 공청4` --- ## 4. STATUS(0x81) DATA 레이아웃 (240 byte) | 블록 | offset | 크기 | 내용 | |---|---|---|---| | 글로벌 | 0~16 | 17 | power, runMode, autoState, fanMode, subMode, hood, hystPreset, hystPM25(7,2), hystPM10(9,2), hystVOC(11,2), hystCO2(13,2), errorCode(15,2) | | 각실 ×4 | 17~72 | 14×4=56 | 거실→침실1→2→3, 4.2 표 | | 리셋 | 73 | 1 | reset 토글 0/1 | | VSP | 74~109 | 4×9=36 | 환기1~4, 바이패스, 공청1~4 의 SA(2)+EA(2) | | 히스 프리셋표 | 110~133 | 8×3=24 | ECO/NORMAL/TURBO 의 PM2.5(2)/PM10(2)/VOC(2)/CO2(2) | | 오염단계 임계표 | 134~229 | 32×3=96 | 프리셋×[CO2,PM2.5,PM10,VOC] 각 L1~L4 u16 | | 각실 온습도 ×4 | 230~237 | 2×4=8 | 실별 Temp(1)+Humi(1) | | (꺼짐)예약 | 238~239 | 2 | 잔여 초 u16 (0=예약없음) | > 계산식 : 17 + 56 + 1 + 36 + 24 + 96 + 8 + 2 = **240 byte** ### 4.1 글로벌 (offset 0~16, 17 byte) | off | 크기 | 필드 | 비고 | |-----|------|---------------|----------------------------------------| | 0 | 1 | power | Power_On | | 1 | 1 | runMode | 3.1 | | 2 | 1 | autoState | 3.4 (분산/집중) | | 3 | 1 | fanMode | 0~4 (Fan_Mode) | | 4 | 1 | subMode | 비트맵 (3.2) | | 5 | 1 | hood | bit0 Hood_YeunDong_Enable / bit1 Hood_Status | | 6 | 1 | hystPreset | 0 ECO / 1 NORMAL / 2 TURBO | | 7 | 2 | hystPM25 | 활성 프리셋 데드밴드 PM2.5 | | 9 | 2 | hystPM10 | 활성 프리셋 데드밴드 PM10 | | 11 | 2 | hystVOC | 활성 프리셋 데드밴드 VOC | | 13 | 2 | hystCO2 | 활성 프리셋 데드밴드 CO2 | | 15 | 2 | errorCode | 비트맵 (Err_Code) | ### 4.2 각실 블록 (offset 17~, 14 byte × 4실 = 56 byte) 순서: 거실 → 침실1 → 침실2 → 침실3 | off(상대) | 크기 | 필드 | 비고 | |-----------|------|-------------|-----------------------------------| | +0 | 1 | damper | 비트맵 bit0=급기(SA) 열림 / bit1=배기(EA) 열림 | | +1 | 2 | pm25 | SEN66_pm2p5 | | +3 | 2 | pm10 | SEN66_pm10p0 | | +5 | 2 | voc | SEN66_VOC_value | | +7 | 2 | co2 | SEN66_CO2_value | | +9 | 1 | airQuality | 3.3 | | +10 | 1 | ledDim | 0~9 (Light_Bright) | | +11 | 2 | loadScore | 각실 부하점수 (Room_Level) | | +13 | 1 | finalVolume | 최종 풍량 (Fan_Mode) | ### 4.3 VSP 블록 (offset 74~109, 9엔트리 × SA(2)·EA(2) = 36 byte) 순서(3.5): 환기1~4 → 바이패스 → 공청1~4. 각 엔트리 SA(2) + EA(2), 빅엔디안. ### 4.4 히스 데드밴드 프리셋표 (offset 110~133, 3프리셋 × PM2.5/PM10/VOC/CO2 u16 = 24 byte) 프리셋(ECO/NORMAL/TURBO)별 하강 데드밴드. 현재 적용값은 글로벌 `hystPM25~hystCO2`(off 7~14) = 본 표의 `[hystPreset]` 행. ### 4.5 오염단계 임계표 (offset 134~229, 3프리셋 × 32byte = 96 byte) 프리셋당 `CO2[L1..L4]` `PM2.5[L1..L4]` `PM10[L1..L4]` `VOC[L1..L4]` 순, 각 u16(빅엔디안). ### 4.6 각실 온습도 (offset 230~237, 4실 × Temp(1)+Humi(1) = 8 byte) 순서: 거실 → 침실1 → 침실2 → 침실3. 디퓨저 SEN66 값, 0~255 클램프. ### 4.7 (꺼짐)예약 잔여초 (offset 238~239, u16 BE) 전원 자동 OFF 까지 잔여 초. 0 = 예약 없음. --- ## 5. 동작 시나리오 1. PC 연결 후 `REQ_STATUS(0x0A)` 송신 → ERV 가 `STATUS(0x81)` 응답. 2. ERV 는 약 500ms~1s 주기로 `STATUS(0x81)` 를 자동 송신 (대시보드 실시간 갱신). 3. PC 가 토글/슬라이드/선택 시 해당 `CTRL_*` 송신 → ERV 가 `ACK(0x82)` + 다음 STATUS 에 반영. 4. PC 는 STATUS 수신 시마다 로그(날짜·시간 + 전체 상태)에 적재/저장. --- ## 6. 구현 매핑 | 계층 | 파일 | 역할 | |---|---|---| | 펌웨어 | `program/User/My_Homenet.c` | 244B 고정 프레임 수신/송신, CMD 적용, STATUS 빌드 | | C# 공용 | `TestProgram/ErvProtocol/CtrlFrame.cs` | 244B 제어 프레임 빌더 | | C# 공용 | `TestProgram/ErvProtocol/FrameParser.cs` | 고정 길이 프레임 분리 + CRC 검증 | | C# 공용 | `TestProgram/ErvProtocol/StatusDecoder.cs` / `StatusEncoder.cs` | STATUS 240B 디코드/인코드 | | C# 대시보드 | `TestProgram/PCDashBoard/Api/IErvApi.cs` / `SerialErvApi.cs` | API 파사드(함수 호출 → 프레임) | > API 함수 목록·사용법은 `260607_PCDashBoard_API_및_프로토콜.md` 1·2장 참조. 본 문서가 와이어 프로토콜 정본이다.