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

208 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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장 참조. 본 문서가 와이어 프로토콜 정본이다.