LG LGAP RS485
LG의 HVAC ODU/IDU 통신에 사용되는 **LGAP(LG Air Conditioner Protocol)**를 Homenet2MQTT에서 구성하기 위한 예제입니다.
이 설정은 공개된 jourdant/esphome-lgap의 프로토콜 분석을 기반으로 합니다.
통신 조건
- RS485
- 4800 bps
- 8 data bits
- No parity
- 1 stop bit
- 상태 응답: 16 bytes
- 제어 요청: 8 bytes
- 체크섬: 체크섬 바이트를 제외한 전체 프레임의 합산(Sum & 0xFF) 결과에
0x55를 최종 XOR (add_final_xor(0x55))
프로토콜 분석 문서에 따르면 ODU는 자발적으로 상태를 보내지 않으므로 zone별 polling이 필요합니다.
Homenet2MQTT 기본 설정
homenet_bridge:
packet_defaults:
rx_header: [0x10]
tx_header: [0x80]
rx_length: 16
rx_checksum: add_final_xor(0x55)
tx_checksum: add_final_xor(0x55)tx_header는 esphome-lgap의 현재 예제 설정에서 사용하는 0x80으로 잡았습니다. LGAP 프로토콜 문서에서는 TX0가 configurable이라고 설명하므로, 실제 설치 환경에서 캡처한 프레임과 일치하는지 확인해야 합니다.
Polling 자동화
LGAP ODU는 실내기 상태를 지속적으로 broadcast하지 않으므로 상태 프레임을 받으려면 각 zone에 read request를 보내야 합니다. lgap/climate.yaml 갤러리 스니펫은 선택한 unit_count에 맞춰 이 polling automation을 자동으로 구성합니다.
갤러리에서 unit_count: 3으로 확장하면 하나의 automation이 생성되며, 시작 시와 5초마다 다음과 같이 zone 0~2를 순서대로 조회합니다.
automation:
- id: lgap_polling
name: 'LGAP 실내기 상태 polling'
trigger:
- type: startup
- type: schedule
every: '5s'
then:
- action: send_packet
data: [0x00, 0xA0, 0x00, 0x00, 0x00, 0x00]
header: true
checksum: true
- action: send_packet
data: [0x00, 0xA0, 0x01, 0x00, 0x00, 0x00]
header: true
checksum: true
- action: send_packet
data: [0x00, 0xA0, 0x02, 0x00, 0x00, 0x00]
header: true
checksum: true각 send_packet의 data는 TX header와 checksum을 제외한 payload입니다. header: true와 checksum: true를 사용하면 packet_defaults.tx_header와 packet_defaults.tx_checksum이 적용됩니다.
RX 상태 프레임
10 status A0 ?? zone error mode|fan target room pipe_in pipe_out active_load power_flag design_load total_load checksum주요 필드는 다음과 같습니다.
| Byte | 의미 | 디코딩 |
|---|---|---|
| 1 | Power / connected / lock / plasma | bit 0 = power |
| 2 | Request echo | 보통 0xA0 |
| 4 | Zone | zone 번호 |
| 5 | Error | 0 = 정상 |
| 6 | Mode + fan | mode bits 0-2, fan bits 4-6 |
| 7 | Target temperature | (data[7] & 0x0F) + 15 °C |
| 8 | Room temperature | (192 - data[8]) / 3 °C |
| 9 | Pipe-in temperature | (192 - data[9]) / 3 °C |
| 10 | Pipe-out temperature | (192 - data[10]) / 3 °C |
| 11 | Zone active load | 0-255 |
| 12 | Zone power state | 0 = running, 1 = off/idle |
| 13 | Zone design load | 0-255 |
| 14 | ODU total load | 0-255 |
TX 제어 프레임
80 00 A0 zone ON|EXE|lock|plasma mode|fan target checksumTX4 bit0: ONTX4 bit1: EXE/WriteTX4 bit2: control lockTX4 bit4: plasmaTX5 bits 0-2: modeTX5 bits 4-6: fan speedTX6: target temperature - 15
예를 들어 zone 0을 22°C 냉방/자동풍으로 켜는 요청의 payload는 다음 형태가 됩니다.
80 00 A0 00 03 40 07 ??마지막 ??는 앞의 7바이트를 합산(SUM & 0xFF)한 결과에 0x55를 최종 XOR한 값입니다 (add_final_xor(0x55)).
갤러리
Homenet2MQTT 갤러리에서 다음 스니펫을 사용할 수 있습니다.
lgap/climate.yaml— zone별 LG 에어컨 Climate 엔티티와 자동 pollinglgap/sensors.yaml— 에러/배관온도/부하 진단 센서lgap/requirements.json— 4800 8N1, 프레임 길이 및 LGAP checksum 요구사항
주의:
jourdant/esphome-lgap의 문서에는 모델/설치 환경에 따라 TX0가 configurable하다고 명시되어 있습니다. 실제 RS485 캡처가 있다면 TX header, zone addressing, fan/mode 값 등을 먼저 검증하는 것을 권장합니다.