Skip to content

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 기본 설정 ​

yaml
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를 순서대로 조회합니다.

yaml
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 상태 프레임 ​

text
10 status A0 ?? zone error mode|fan target room pipe_in pipe_out active_load power_flag design_load total_load checksum

주요 필드는 다음과 같습니다.

Byte의미디코딩
1Power / connected / lock / plasmabit 0 = power
2Request echo보통 0xA0
4Zonezone 번호
5Error0 = 정상
6Mode + fanmode bits 0-2, fan bits 4-6
7Target temperature(data[7] & 0x0F) + 15 °C
8Room temperature(192 - data[8]) / 3 °C
9Pipe-in temperature(192 - data[9]) / 3 °C
10Pipe-out temperature(192 - data[10]) / 3 °C
11Zone active load0-255
12Zone power state0 = running, 1 = off/idle
13Zone design load0-255
14ODU total load0-255

TX 제어 프레임 ​

text
80 00 A0 zone ON|EXE|lock|plasma mode|fan target checksum
  • TX4 bit0: ON
  • TX4 bit1: EXE/Write
  • TX4 bit2: control lock
  • TX4 bit4: plasma
  • TX5 bits 0-2: mode
  • TX5 bits 4-6: fan speed
  • TX6: target temperature - 15

예를 들어 zone 0을 22°C 냉방/자동풍으로 켜는 요청의 payload는 다음 형태가 됩니다.

text
80 00 A0 00 03 40 07 ??

마지막 ??는 앞의 7바이트를 합산(SUM & 0xFF)한 결과에 0x55를 최종 XOR한 값입니다 (add_final_xor(0x55)).

갤러리 ​

Homenet2MQTT 갤러리에서 다음 스니펫을 사용할 수 있습니다.

  • lgap/climate.yaml — zone별 LG 에어컨 Climate 엔티티와 자동 polling
  • lgap/sensors.yaml — 에러/배관온도/부하 진단 센서
  • lgap/requirements.json — 4800 8N1, 프레임 길이 및 LGAP checksum 요구사항

주의: jourdant/esphome-lgap의 문서에는 모델/설치 환경에 따라 TX0가 configurable하다고 명시되어 있습니다. 실제 RS485 캡처가 있다면 TX header, zone addressing, fan/mode 값 등을 먼저 검증하는 것을 권장합니다.