Files
HECO2/Protocol/HOMENET/PC_ERV_Protocol.md
T
jeon 5a96a696b1 chore: HERV 통합 저장소 초기 커밋
- 펌웨어(program), C# 대시보드(TestProgram), 시뮬레이터(Simulator),
  프로토콜/문서(Protocol, doc) 전체를 단일 저장소로 통합
- program 폴더의 별도 git 저장소를 제거하고 통합 저장소에 흡수
- 빌드 산출물(program/build, bin/obj, *.o/.elf/.bin/.hex 등) .gitignore 처리
- 사내 Synology NAS Git 원격 연결 예정

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-15 21:44:23 +09:00

11 KiB
Raw Blame History

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_SUBMODEtype :

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 환기14, 바이패스, 공청14 의 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): 환기14 → 바이패스 → 공청14. 각 엔트리 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장 참조. 본 문서가 와이어 프로토콜 정본이다.