반응형

 

 제작년에 거실을 꾸미고 있을 때 이케아에서 스탠드 조명을 하나 샀습니다.

 집에 오는 사람마다 이 조명 예쁘다고 한마디씩 해줬었는데요. 기존에는 스마트 플러그를 이용해서 on/off 만 자동화 했습니다. 저녁 6시에 자동으로 켜지고, 밤 11시쯤 자동으로 꺼지구요. 구글홈/빅스비로 음성으로 켜고 끄기도 되서 잘 쓰고 있었습니다.

 하지만 쓰다보면 만족하지 못하는게 있었는데, 바로 밝기 조절이 안된다는 사실이었습니다. 다른 간접 조명들은 Philps 의 Hue 조명을 사용하고 있어서 밝기조절(dimmable)과 색온도(color temp)조절까지 되는데 이녀석은 아무것도 안되서 불만족 스럽더라구요.

셰펜나 조명 - IKEA

 많이 사용하는 일반적인 E26 전구 소켓이면 좋을텐데.. gx53이라는 듣도보도 못한 소켓을 쓰고 있어서 답이 없습니다. gx53 소켓을 e26으로 변환하는게 있긴 한데 웹서핑해서 결과물을 보니 빛이 퍼져나가는 모습이 아름답지 않더라구요.

 그러다 문득 생각난 사실이 있었는데 원래 구입했던 LED 전구가 밝기조절은 된다는 사실이었죠. 그런데 어디를 봐도 밝기 조절을 하는게 보이지 않고 그냥 켜고 끄는 스위치만 보입니다. 알고보니 밝기 조절을 위해서는 조광기(dimmer)를 따로 설치하거나 연결해야 하는 거였죠. 

밝기 조절 됩니다!

 

 

 그럼 조광기만 있으면 되겠네요? 당연히 스마트한 조광기를 찾아봅니다. 네이버 스마트씽스 카페에서 사용기가 있는 zigbee 3.0 dimmer switch가 눈에 들어옵니다. 기존에 zigbee bridge 가 있어야 연결 가능합니다.

cafe.naver.com/stsmarthome/19714

 

Zigbee 3.0 dimmer switch

안녕하세요​갓북왕 입니다!​​오늘의 설정기는 zigbee 3.0 dimmer switch 입니다.원본링크 : https://blog.naver.com/godlastoise/2...

cafe.naver.com

 

aliexpress 에서 구입합니다. 디머 스위치는 무료배송 19.9달러. 조금 비싼데요?

ko.aliexpress.com/item/32954762426.html?spm=a2g0s.9042311.0.0.7c714c4dlumSab

 

US $17.95 50% OFF|Zigbee 3.0 스위치 DIY 홈 장치 스마트 원격 제어 Smartthings 에코 플러스 정장 지그비 허�

Smarter Shopping, Better Living! Aliexpress.com

ko.aliexpress.com

 

배송은 넉넉히 2주정도 걸렸습니다.

 

 

바로 설치합니다.

 

꾸깃꾸깃 설명서를 봅니다.

 대충 중간에 선을 짤라서 들어오는 선은 디머에 인풋단에 넣고 등으로 가야 하는 선은 output에 넣으면 되네요.

사실 집에서 쓴느 전기 배선도 활성선(Live, 파란선 또는 흰선) 과 중성선(Neutral, 검은선 또는 갈색선) 이 있지만 교류라서 대부분의 장비는 그냥 꽃아도 됩니다. 다만 조명을 스위치에 연결할때는 활성선과 중성선을 구분해 줘야 하는데요. 이유는 다음번에 설명하도록 하고.. 이 디머의 경우에는 뒤집어 꽃으면 안켜질거 같네요. 동작 안아면 코드를 뽑아서 반대로 넣어주면 될거 같습니다. 쉽죠?

 

 준비물은 드라이버와 가위(선 스트리퍼가 있으면 더 좋습니다)만 있으면 됩니다. 그리고 디머를 조명 아래에 부착하기 위해서 3m 양면테이프와 벨크로 테이프를 사용했습니다. 선을 자르고 가위로 열심히 피복을 벗기고 선을 끼우고 나사를 조여봅시다. 

 

 

 제어를 위해서는 기존에 사용하는 ZigBee 장비가 있어야 하는데 저는 Philips hue bridge 가 있으니까 여기다 연동시켜보겠습니다.

 

 Hue 앱에서 설정 -> 조명 설정 -> 조명 추가 를 누르고 검색해서 나오는 등을 추가하면 됩니다.

 

 

조명 검색 

 

 

추가된 조명

 

 조명이 추가되서 이제 hue 앱에서 제어 가능합니다. hue switch 에 등록해서도 제어 가능합니다.

 단점이라면 빛의 밝기가 너무 급격하게 변하는 느낌을 받습니다. hue의 경우에는 천천히 밝기가 변해서 자연스러운 느낌을 최대한 주거든요. 이런 디테일이 있어서 비싸도 hue를 쓰나 봅니다.

 

제어 가능

 

 

 이제 밝기 조절도 가능하고 스마트하게 켜지고 늦은 밤에는 어둡게 켜지고 아침엔 꺼지게 만들어야겠습니다. hue 앱에서 다 됩니다. 아니면 smartthings 나 homeassistant 와 연동해서 자동화 해도 됩니다.

 

 

구석에 짱박혀 있는 조명

 

 

다음번에는 천장에 있는 다운라이트를 hue 조명으로 바꾸려 합니다. 그런데 amazone 독일에 배송시킨 조명이 안오네요...다음달에 해야할듯 싶습니다. 

반응형
반응형

아파트 월패드용 스마트폰 어플이 있으나 도저히 사용할 수 없는 속도다.

프로그램 실행하는데 하세월 걸리고 버튼 누르고 변경되는걸 확인하는데도 몇초씩 걸린다.

 

불편함에 찾아보니 이미 선구자들이

월패드와 전등, 보일러 등 연결된 장치간 통신이 RS485 이며 해당 패킷을 분석하고 패킷을 보내서 제어를 하고 있다.

 

 

기본적으로 서버가 필요하며 라즈베리 파이나 도커 설치 가능한 NAS를 주로 사용한다.

 

RS485 제어 방법은 크게 아래 3가지다.

  • 서버에 직접 RS485-USB 장치를 연결 (패킷 제어 프로그램 필요. node.js나 파이썬 버전으로 제작되어있음)
  • RS485 to wifi 장치를 연결 (패킷 제어 프로그램 필요. node.js나 파이썬 버전으로 제작되어있음 )
  • ESPHome 장치를 이용한 제어 (Home assistant 플러그인 있음)

 

 

 

자세한 내용은 아래를 읽어보며 따라가면 된다.

 

cafe.naver.com/stsmarthome/12973

 

월패드 연동 ESPHOME RS485...

2020-04-01 업데이트 1. 체크섬 2byte 대응 checksum2 옵션 추가 (a...

cafe.naver.com

 

cafe.naver.com/stsmarthome/18238

 

[ESPHome] 현대통신 월패드 R...

대한민국 모임의 시작, 네이버 카페

cafe.naver.com

 

 

 

본인은 HA(Home assistant) 에서 가장 간편하게 사용 할 수 있는 ESPhome 버전으로 사용하고 있다.

사용을 위한 준비 과정을 요약하면 아래와 같다. 

1. 준비물

  • NAS (또는 라즈베리파이) 
  • Wemo d1 mini (RS8266 장치, 와이파이 가능한 프로그래밍 보드)
  • RS485 to UART
  • 납땜 장비, 소량의 전선
  • ESPeasy 펌웨어
  • HASS.io 설치 (home assistant 와 기타 애드온 관리 프로그램 통합된 버전)
  • 5V 1A 정도의 usb 충전기

2. 사용방법 요약

 

 

3. 사용중인 설정 내용

같은 imazu 여도 아파트마다 조금씩 패킷이 다르다. 참조할 것..

 

백업을 위해서 사용중인 esphome 데이터를 아래와 같이 붙여넣는다.

substitutions:
  node_name: rs485
  device_name: "RS485 Controller"
  
esphome:
  name: imazu_home_kks
  platform: esp8266
  board: d1_mini

wifi:
  ssid: "SSID"
  password: "PASSWORD"
  manual_ip:
    static_ip: 192.168.1.4 #(YOUR IP)
    gateway: 192.168.1.1
    subnet: 255.255.255.0
  reboot_timeout: 10min
  
  # Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "Fallback Hotspot"
    password: "FALLBACK HOTSPOT PASSWORD"

captive_portal:


debug:
# Enable logging
logger:
  baud_rate: 0
  level: DEBUG #기본값
  #level: VERBOSE #사용하지 않는 패킷만 출력
  #level: VERY_VERBOSE #전체 패킷 출력 (초기 설정시에 추천)

# Enable Home Assistant API
api:
  reboot_timeout: 0s

ota:
  password: "PASSWORD"

status_led:
  pin: 
    number: GPIO2
    inverted: True


# RS485 Component (for ttl to rs485 module)
#  - esp8266: UART0 (TX: GPIO1, RX: GPIO3)
#  - esp32: UART2 (TX: GPIO17, RX: GPIO16)
rs485:
  baud_rate: 9600 #Required
  data_bits: 8    #Option(default: 8)
  parity: 0       #Option(default: 0)
  stop_bits: 1    #Option(default: 1)
  
  rx_wait: 10     #Option(default: 10ms)  -> 수신 메시지 대기시간 (10ms 미만으로 수신된 메시지만 한 패킷으로 판단)
  tx_interval: 50 #Option(default: 50ms) -> 발신 메시지 전송 간격 (패킷 수신 후 50ms 대기 후 전송)
  tx_wait: 100    #Option(default: 100ms) -> 발신 메시지 Ack 대기시간
  tx_retry_cnt: 3 #Option(default: 3)     -> 발신 메시지 Ack 없을 경우 재시도 횟수
  prefix: [0xF7]  #Option -> 값 세팅시 모든 수신 패킷 Check, 발신 패킷에 Append
  suffix: [0xEE]  #Option -> 값 세팅시 모든 수신 패킷 Check, 발신 패킷에 Append

  checksum: True      #Option(default: False) -> 체크섬 사용여부 (lambda 사용시 세팅 불필요)
  # checksum_lambda: |- #Option -> Default(CheckSum8 Xor) 체크섬 아닐 경우 직접 로직 구현(아래 값은 Default 로직임)
  #   // @param: const uint8_t *data, const unsigned short len
  #   // @return: uint8_t
  #   uint8_t crc = 0xF7; // data 변수에는 prefix 제외되어 있음
  #   for(num_t i=0; i<len; i++)
  #     crc ^= data[i];
  #   return crc;
  
  checksum2: False  #Option(default: False) -> ADD 체크섬 사용여부
  # checksum2: !lambda |- #Option -> Default(CheckSum8 Add) 체크섬 아닐 경우 직접 로직 구현(아래 값은 Default 로직임)
  #   // @param: const uint8_t *data, const unsigned short len, const uint8_t checksum1
  #   // @return: uint8_t
  #   uint8_t crc = 0xF7; // data 변수에는 prefix 제외되어 있음
  #   for(num_t i=0; i<len; i++)
  #     crc += data[i];
  #   crc += checksum1; // 첫번째 체크섬 계산 결과
  #   return crc;
  
#  state_response: #Option -> 값 세팅시 response 패킷 수신 후에 명령 패킷 송신
#    data: [0x04]
#    offset: 3
#    and_operator: False #Option(default: False) 수신패킷의 offset 위치와 data[0] And 비트연산 (비트위치-1: 0x01, 2: 0x02, 3: 0x04, 4: 0x08, 5: 0x10, 6: 0x20, 7: 0x40, 8: 0x80)
#    inverted: False #Option(default: False) 결과 값 반전(일치하지 않을 경우 참)
    
    
#  packet_monitor: #Option -> 패킷 모니터: Array 없으면 전체 출력, 있을 경우 or 조건 (logger level DEBUG 추천)
#   - [0x0c, 0x01, 0x2b]  # offset: 0
#   - data: [0x19, 0x04, 0x40, 0x23]
#     offset: 2

# RS485 Device 셋팅 팁
# 1. 상태 확인용(수신) Schema
#   - 대상: device(Required), sub_device(Option), state*
#   - 조건: device and sub_device 일치할때만 해당 Device에 패킷 전달됨
#   - 예시:
#     device: 
#       offset: 0 # 수신 패킷 비교 위치 (prefix 제외)
#       data: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x00] # hex array
#       and_operator: False # And 비트연산 사용여부
#       inverted: False #Option(default: False) 결과 값 반전 여부
#     #alias schema
#     device: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x00] # offset: 0, data: hex array
#
# 2. 명령용(발신) Schema
#   - 대상: command*
#   - 예시:
#     command:
#       data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x21, 0x01, 0x00]  # prefix, checksum, suffix 제외
#       ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x21, 0x01, 0x01]   # prefix, checksum, suffix 제외
#     # Ack 없을 경우
#     command: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x21, 0x01, 0x00]
#     # Template(lambda): command_on, command_off
#     command_on: !lambda |-
#       uint8_t flag = id(balcony).state ? 0x02 : 0x01;
#       return {
#                 {0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, flag, 0x00},
#                 {0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x01, 0x01}
#              };
#     command_off: !lambda |-
#       uint8_t flag = id(balcony).state ? 0x02 : 0x01;
#       return {
#                 {0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, flag, 0x00},
#                 {0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x02, 0x02}
#              };
#     # 상태확인 요청 (Sensor 포함 모든 Device에 사용 가능)
#     command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x23, 0x00, 0x00] #Option
#     update_interval: 30s #Option(default: 60s)
#
# 3. Automation Schema
#   - rs485.write:
#       data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, 0x01, 0x00]
#       ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x01, 0x01]
#   - rs485.write: !lambda return {{0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, 0x01, 0x00}, {0x0b, 0x01, 0x19, 0x04, 0x40, 0x23, 0x01, 0x01}};
#   # Ack 없는 경우
#   - rs485.write: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, 0x01, 0x00]
#   - rs485.write: !lambda return {{0x0b, 0x01, 0x19, 0x02, 0x40, 0x23, 0x01, 0x00}, {}};



# RS485 Sensor

globals:
  - id: EV_CALL_COUNT
    type: int
    initial_value: '0'
  - id: EV_CALLING
    type: bool
    initial_value: 'false'

sensor:
  #엘리베이터 방향 정보
  - platform: rs485
    id: EV_ARRIVE
    device: [0x0D, 0x01, 0x34, 0x01, 0x41, 0x10, 0x00]
    #device: [0x0D, 0x01, 0x34, 0x01, 0x41, 0x10, 0x00]  kks 
    data:
      offset: 7
      length: 1
    on_value:
      then:
        - text_sensor.template.publish:
            id: EV_DIRECTION
            state: !lambda |-
              if (x == 0x01) return "도착";
              else if (x == 0xA6) return "UP";
              else if (x == 0xB6) return "DOWN";
              else return "";
  # 엘리베이터 층수 정보
  - platform: rs485
    id: EV
    device: [0x0D, 0x01, 0x34, 0x01, 0x41, 0x10, 0x00]
    #device: [0x0D, 0x01, 0x34, 0x01, 0x41, 0x10, 0x00]  kks
    lambda: !lambda |-
      if(len < 9) return {};
      char buf[3];
      sprintf(buf, "%02X ", data[8]);
      if(buf[0] == 'F')
        if(buf[1] == 'F') return -1.0;
        else return -2.0;
      else
        return atof(buf);
    on_value:
      then:
        - text_sensor.template.publish:
            id: EV_TEXT
            state: !lambda |-
              char result[10];
              if(x == 0) sprintf(result, "");
              else if(x > 0) sprintf(result, "%1.0f층", x);
              else sprintf(result, "지하 %1.0f층", -x);
              return result;

text_sensor:
  - platform: homeassistant
    name: Google Home mini TTS state
    icon: "mdi:speaker"
    entity_id: sensor.tts_state
    id: TTS_STATE

  # 엘리베이터 층수 정보
  - platform: template
    name: Elevator Floor
    icon: "mdi:elevator"
    id: EV_TEXT
    on_value:
      then:
        - if:
            condition:
              lambda: |-
                return ( "" != id(EV_TEXT).state );
            then:
              # 층수 정보가 업데이트 될 경우 엘리베이터 호출에 성공한 것으로 판단
              - globals.set:
                  id: EV_CALLING
                  value: 'false'
              # TTS로 엘리베이터 층수 방송
              - if:
                  condition:
                    lambda: |-
                      return ( "off" == id(TTS_STATE).state );
                  then:
                    - homeassistant.service:
                        service: media_player.turn_on
                        data:
                          entity_id: media_player.sigtagyeop
              - homeassistant.service:
                  service: tts.google_say
                  data:
                    entity_id: media_player.sigtagyeop
                    message: !lambda 'return id(EV_TEXT).state;'

  # 엘리베이터 방향(UP/DOWN/도착) 정보
  - platform: template
    name: Elevator Direction
    icon: "mdi:elevator"
    id: EV_DIRECTION
    on_value:
      - if:
          condition:
            text_sensor.state:
              id: EV_DIRECTION
              state: '도착'
          then:
            # 방향 정보가 업데이트 될 경우 엘리베이터 호출에 성공한 것으로 판단
            - globals.set:
                id: EV_CALLING
                value: 'false'
            - delay: 5s
            - homeassistant.service:
                service: media_player.turn_off
                data:
                  entity_id: media_player.sigtagyeop


switch:
    
  # 안방1 콘센트
  # 켜기
  #  0xf7 0x0b 0x01 0x1f 0x02 0x40 0x21 0x01 0x00 0x80 0xee
  #  0xf7 0x0b 0x01 0x1f 0x04 0x40 0x21 0x01 0x01 0x87 0xee (ack)
  # 끄기
  #  0xf7 0x0b 0x01 0x1f 0x02 0x40 0x21 0x02 0x00 0x83 0xee
  #  0xf7 0x0b 0x01 0x1f 0x04 0x40 0x21 0x02 0x02 0x87 0xee (ack)
  # 켜기상태-> 0xF7 0x12 0x01 0x1F 0x04 0x40 0x21 0x00 0x01 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x9E 0xEE
  # 끄기상태-> 0xF7 0x12 0x01 0x1F 0x04 0x40 0x21 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x01 0x9D 0xEE

  - platform: template
    name: Elevator Call
    icon: "mdi:elevator"
    turn_on_action:
      # 엘리베이터 호출 cmd는 최대 30번
      # 점검 등의 사유로 호출이 안될 경우 중단을 위해 최대 카운트 설정
      - globals.set:
          id: EV_CALL_COUNT
          value: '25'
      # 엘리베이터 호출에 성공할 경우 cmd 보내는 것을 중지하기 위한 변수
      # 층수 정보(EV_TEXT)가 업데이트 될 경우 엘리베이터 호출에 성공한 것으로 판단
      - globals.set:
          id: EV_CALLING
          value: 'true'
      # TTS로 엘리베이터 호출 방송
      - homeassistant.service:
          service: media_player.turn_on
          data:
            entity_id: media_player.sigtagyeop
      - homeassistant.service:
          service: tts.google_say
          data:
            entity_id: media_player.sigtagyeop
            message: 엘리베이터를 호출합니다.
      # TTS 방송이 완료될 때 까지 대기
      # 대기하지 않을 경우 층수 정보(EV_TEXT) 방송에 의해 호출 방송이 중단 됨
      - delay: 2s
      # 반복문
      - while:
          # 엘리베이터 호출에 성공하거나, 최대 30번까지만 cmd를 전송
          condition:
            lambda: |-
              return ( 0 < id(EV_CALL_COUNT) ) && ( true == id(EV_CALLING) );
          # 1초마다 한번씩 cmd를 전송
          # cmd를 전송할 때 마다 카운트 변수를 1씩 차감
          then:
            - rs485.write: [0x0B, 0x01, 0x34, 0x04, 0x41, 0x10, 0x00, 0x06]
            #- rs485.write: [0x0B, 0x01, 0x34, 0x04, 0x41, 0x10, 0x00, 0x06]  kks 
            - lambda: |-
                id(EV_CALL_COUNT) -= 1;
            - delay: 1s
      # 엘리베이터 호출에 실패할 경우 TTS로 호출 실패 방송
      - if:
          condition:
            lambda: |-
              return ( 0 == id(EV_CALL_COUNT) );
          then:
            - homeassistant.service:
                service: tts.google_say
                data:
                  entity_id: media_player.sigtagyeop
                  message: 엘리베이터 호출에 실패했습니다.
            - delay: 3s
            - homeassistant.service:
                service: media_player.turn_off
                data:
                  entity_id: media_player.sigtagyeop
 
  - platform: rs485
    name: "Bedroom Power Socket 1"
    icon: "mdi:power-socket-eu"
    device: [0x25, 0x01, 0x1F, 0x04, 0x40, 0x20, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x21, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x21, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x21, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x21, 0x02, 0x02]
    #command_state: [0x0B, 0x01, 0x1f, 0x01, 0x40, 0x20, 0x00, 0x00] #Option
    #update_interval: 997s #Option(default: 60s)
    
  # 안방2 콘센트
  - platform: rs485
    name: "Bedroom Power Socket 2"
    icon: "mdi:power-socket-eu"
    device: [0x25, 0x01, 0x1F, 0x04, 0x40, 0x20, 0x00]
    state_on:
      offset: 17
      data: [0x01]
    state_off:
      offset: 17
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x22, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x22, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x22, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x22, 0x02, 0x02]

  # 안방3 콘센트
  - platform: rs485
    name: "Bedroom Power Socket 3"
    icon: "mdi:power-socket-eu"
    device: [0x25, 0x01, 0x1F, 0x04, 0x40, 0x20, 0x00]
    state_on:
      offset: 26
      data: [0x01]
    state_off:
      offset: 26
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x23, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x23, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x23, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x23, 0x02, 0x02]
      
  # 거실1 콘센트
  - platform: rs485
    name: "Livingroom Power Socket 1"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x10]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x11, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x11, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x11, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x11, 0x02, 0x02]
    #command_state: [0x0B, 0x01, 0x1f, 0x01, 0x40, 0x10, 0x00, 0x00] #Option
    #update_interval: 991s #Option(default: 60s)


  # 거실2 콘센트
  - platform: rs485
    name: "Livingroom Power Socket 2"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x10]
    state_on:
      offset: 17
      data: [0x01]
    state_off:
      offset: 17
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x12, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x12, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x1f, 0x02, 0x40, 0x12, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x1f, 0x04, 0x40, 0x12, 0x02, 0x02]


  # 컴퓨터방 콘센트1
  # 켜기
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x02, 0x40, 0x41, 0x01, 0x00, 0xE0, 0xEE
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x04, 0x40, 0x41, 0x01, 0x01, 0xE7, 0xEE  ack
  # 끄기
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x02, 0x40, 0x41, 0x02, 0x00, 0xE3, 0xEE
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x04, 0x40, 0x41, 0x02, 0x02, 0xE7, 0xEE
  
  - platform: rs485
    name: "Computer Room Power Socket 1"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x40, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x41, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x41, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x41, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x41, 0x02, 0x02]
    #command_state: [0x0B, 0x01, 0x1f, 0x01, 0x40, 0x40, 0x00, 0x00] #Option
    #update_interval: 983s #Option(default: 60s)

  # 컴퓨터방 콘센트2
  # 켜기
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x02, 0x40, 0x42, 0x01, 0x00, 0xE3, 0xEE
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x04, 0x40, 0x42, 0x01, 0x01, 0xE4, 0xEE  ack
  # 끄기
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x02, 0x40, 0x42, 0x02, 0x00, 0xE0, 0xEE
  #, 0xF7, 0x0B, 0x01, 0x1F, 0x04, 0x40, 0x42, 0x02, 0x02, 0xE4, 0xEE


  - platform: rs485
    name: "Computer Room Power Socket 2"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x40, 0x00]
    state_on:
      offset: 17
      data: [0x01]
    state_off:
      offset: 17
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x42, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x42, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x42, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x42, 0x02, 0x02]

  # 작은방 콘센트1

  - platform: rs485
    name: "Room3 Power Socket 1"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x30, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x31, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x31, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x31, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x31, 0x02, 0x02]
    #command_state: [0x0B, 0x01, 0x1f, 0x01, 0x40, 0x30, 0x00, 0x00] #Option
    #update_interval: 977s #Option(default: 60s)
    
    
  # 작은방 콘센트2

  - platform: rs485
    name: "Room3 Power Socket 2"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x30, 0x00]
    state_on:
      offset: 17
      data: [0x01]
    state_off:
      offset: 17
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x32, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x32, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x32, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x32, 0x02, 0x02]

  # 주방 콘센트1

  - platform: rs485
    name: "Kitchen Power Socket 1"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x50, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x51, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x51, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x51, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x51, 0x02, 0x02]
    #command_state: [0x0B, 0x01, 0x1f, 0x01, 0x40, 0x50, 0x00, 0x00] #Option
    #update_interval: 971s #Option(default: 60s)
    
    
  # 주방 콘센트2
  - platform: rs485
    name: "Kitchen Power Socket 2"
    icon: "mdi:power-socket-eu"
    device: [0x1C, 0x01, 0x1F, 0x04, 0x40, 0x50, 0x00]
    state_on:
      offset: 24
      data: [0x01]
    state_off:
      offset: 24
      data: [0x02]
    command_on:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x52, 0x01, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x52, 0x01, 0x01]
    command_off:
      data: [0x0B, 0x01, 0x1F, 0x02, 0x40, 0x52, 0x02, 0x00]
      ack: [0x0B, 0x01, 0x1F, 0x04, 0x40, 0x52, 0x02, 0x02]


# RS485 Light(like Binary Light)
light:
  # [안방1]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x21, 0x00, 0x01, 0x80, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x21, 0x00, 0x02, 0x83, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x21, 0x01, 0x00, 0x86, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x21, 0x02, 0x00, 0x85, 0xee
  - platform: rs485
    name: "Bedroom 1"
    device: [0x0c, 0x01, 0x19, 0x04, 0x40, 0x20, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x21, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x21, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x21, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x21, 0x02, 0x02]
#    command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x20, 0x00, 0x00] #Option
#    update_interval: 101s #Option(default: 60s)
    
  # [안방2]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x22, 0x00, 0x01, 0x83, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x22, 0x00, 0x02, 0x80, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x22, 0x01, 0x00, 0x85, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x22, 0x02, 0x00, 0x86, 0xee
  - platform: rs485
    name: "Bedroom 2"
    device: [0x0c, 0x01, 0x19, 0x04, 0x40, 0x20, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x22, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x22, 0x01, 0x01]
    command_off: 
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x22, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x22, 0x02, 0x02]


  # [거실1]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x11, 0x00, 0x01, 0xb0, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x11, 0x00, 0x02, 0xb3, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x11, 0x01, 0x00, 0xb6, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x11, 0x02, 0x00, 0xb5, 0xee
  - platform: rs485
    name: "Livingroom 1"
    device: [0x0D, 0x01, 0x19, 0x04, 0x40, 0x10, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x11, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x11, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x11, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x11, 0x02, 0x02]
#    command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x10, 0x00, 0x00] #Option
#    update_interval: 103s #Option(default: 60s)
 

  # [거실2]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x12, 0x00, 0x01, 0xb3, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x12, 0x00, 0x02, 0xb0, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x12, 0x01, 0x00, 0xb5, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x12, 0x02, 0x00, 0xb6, 0xee
  - platform: rs485
    name: "Livingroom 2"
    device: [0x0D, 0x01, 0x19, 0x04, 0x40, 0x10, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x12, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x12, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x12, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x12, 0x02, 0x02]



  # [발코니]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x13, 0x00, 0x01, 0xb2, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x13, 0x00, 0x02, 0xb1, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x13, 0x01, 0x00, 0xb4, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x13, 0x02, 0x00, 0xb7, 0xee
  - platform: rs485
    name: "Livingroom 3"
    device: [0x0D, 0x01, 0x19, 0x04, 0x40, 0x10, 0x00]
    state_on:
      offset: 9
      data: [0x01]
    state_off:
      offset: 9
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x13, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x13, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x13, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x13, 0x02, 0x02]


  # [작은방]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x31, 0x01, 0x01, 0x91, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x31, 0x02, 0x02, 0x91, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x31, 0x01, 0x00, 0x96, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x31, 0x02, 0x00, 0x95, 0xee
  - platform: rs485
    name: "Room 3"
    device: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x30, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x31, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x31, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x31, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x31, 0x02, 0x02]
#    command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x30, 0x00, 0x00] #Option
#    update_interval: 107s #Option(default: 60s)
    
      
  # [컴퓨터방]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x41, 0x01, 0x01, 0xe1, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x41, 0x02, 0x02, 0xe1, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x41, 0x01, 0x00, 0xe6, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x41, 0x02, 0x00, 0xe5, 0xee
  - platform: rs485
    name: "Computer Room"
    device: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x40, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x41, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x41, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x41, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x41, 0x02, 0x02]
#    command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x40, 0x00, 0x00] #Option
#    update_interval: 109s #Option(default: 60s)

      
  # [주방]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x51, 0x01, 0x01, 0xf1, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x51, 0x02, 0x02, 0xf1, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x51, 0x01, 0x00, 0xf6, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x51, 0x02, 0x00, 0xf5, 0xee
  - platform: rs485
    name: "Kitchen"
    device: [0x0C, 0x01, 0x19, 0x04, 0x40, 0x50, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x51, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x51, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x51, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x51, 0x02, 0x02]
#    command_state: [0x0B, 0x01, 0x19, 0x01, 0x40, 0x50, 0x00, 0x00] #Option
#    update_interval: 113s #Option(default: 60s)
      
      
  # [식탁]
  # 켜짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x52, 0x01, 0x01, 0xf2, 0xee
  # 꺼짐 상태-> 0xf7, 0x0b, 0x01, 0x19, 0x04, 0x40, 0x52, 0x02, 0x02, 0xf2, 0xee
  # 켜짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x52, 0x01, 0x00, 0xf5, 0xee
  # 꺼짐 명령-> 0xf7, 0x0b, 0x01, 0x19, 0x02, 0x40, 0x52, 0x02, 0x00, 0xf6, 0xee
  - platform: rs485
    name: "Table"
    device: [0x0C, 0x01, 0x19, 0x04, 0x40, 0x50, 0x00]
    state_on:
      offset: 8
      data: [0x01]
    state_off:
      offset: 8
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x52, 0x01, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x52, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x19, 0x02, 0x40, 0x52, 0x02, 0x00]
      ack: [0x0b, 0x01, 0x19, 0x04, 0x40, 0x52, 0x02, 0x02]


# RS485 Fan
fan:
  # [환기]
  # 켜짐(강) 상태-> 0xf7, 0x0c, 0x01, 0x2b, 0x04, 0x42, 0x11, 0x07, 0x01, 0x07, 0x87, 0xee
  # 켜짐(중) 상태-> 0xf7, 0x0c, 0x01, 0x2b, 0x04, 0x42, 0x11, 0x03, 0x01, 0x03, 0x87, 0xee
  # 켜짐(약) 상태-> 0xf7, 0x0c, 0x01, 0x2b, 0x04, 0x42, 0x11, 0x01, 0x01, 0x01, 0x87, 0xee
  # 꺼짐     상태-> 0xf7, 0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x02, 0x02, 0x01, 0x85, 0xee
  # 켜짐(강) 명령-> 0xf7, 0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x07, 0x00, 0x80, 0xee
  # 켜짐(중) 명령-> 0xf7, 0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x03, 0x00, 0x84, 0xee
  # 켜짐(약) 명령-> 0xf7, 0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x01, 0x00, 0x86, 0xee
  # 꺼짐     명령-> 0xf7, 0x0b, 0x01, 0x2b, 0x02, 0x40, 0x11, 0x02, 0x00, 0x87, 0xee
  - platform: rs485
    name: "Ventilation"
    device: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x00]
    state_on:
      offset: 7
      data: [0x01]
    state_off:
      offset: 7
      data: [0x02]
    command_on:
      data: [0x0b, 0x01, 0x2b, 0x02, 0x40, 0x11, 0x01, 0x00]
#      ack: [0x0c, 0x01, 0x2b, 0x04, 0x41, 0x2b, 0x04, 0x40, 0x11, 0x00, 0x01]
      ack: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x01, 0x01, 0x01]
    command_off:
      data: [0x0b, 0x01, 0x2b, 0x02, 0x40, 0x11, 0x02, 0x00]
      ack: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x02, 0x02, 0x01]
    speed: #Option(high, medium, low) -> 없으면 Binary Fan
      high:
        state:
          offset: 7
          data: [0x01, 0x07]
#          data: [0x07, 0x01, 0x07]
        command:
          data: [0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x07, 0x00]
  #        data: [0x0c, 0x01, 0x2b, 0x04, 0x42, 0x11, 0x07, 0x01, 0X07 ]
          ack: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x00, 0x01, 0x07]
      medium:
        state:
          offset: 7
          data: [0x01, 0x03]
        command:
#          data: [0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x03, 0x00, 0x84
          data: [0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x03, 0x00]
          ack: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x00, 0x01, 0x03]
      low:
        state:
          offset: 7
          data: [0x01, 0x01, 0x01]
        command:
          data: [0x0b, 0x01, 0x2b, 0x02, 0x42, 0x11, 0x01, 0x00]
          ack: [0x0c, 0x01, 0x2b, 0x04, 0x40, 0x11, 0x00, 0x01, 0x01]
 #   command_state: [0x0B, 0x01, 0x2b, 0x01, 0x40, 0x11, 0x00, 0x00] #Option
#    update_interval: 107s #Option(default: 60s)


# RS485 Climate
climate:
  # [거실 난방] 0x11
  # 상태 요청: 0xF7, 0x0B, 0x01, 0x18, 0x01, 0x45, 0x11, 0x00, 0x00, 0xB0, 0xEE
  # 켜짐 상태: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x45, 0x11, 0x00, (0x01, 0x1B, 0x17), 0xBE, 0xEE (상태, 현재온도, 설정온도)
  # 꺼짐 상태: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x45, 0x11, 0x00, (0x04, 0x1B, 0x17), 0xBB, 0xEE (상태, 현재온도, 설정온도)
  # 외출 상태: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x45, 0x11, 0x00, (0x07, 0x1B, 0x17), 0xB9, 0xEE
  # 켜짐 명령: 0xF7, 0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, 0x01, 0x00, 0xB1, 0xEE
  #      ACK: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, 0x01, 0x01, 0x1B, 0x17, 0xBC, 0xEE
  # 꺼짐 명령: 0xF7, 0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, 0x04, 0x00, 0xB4, 0xEE
  #      ACK: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, 0x04, 0x04, 0x1B, 0x17, 0xBC, 0xEE
  # 온도 조절: 0xF7, 0x0B, 0x01, 0x18, 0x02, 0x45, 0x11, (0x18), 0x00, 0xA7, 0xEE (온도 24도 설정)
  #      ACK: 0xF7, 0x0D, 0x01, 0x18, 0x04, 0x45, 0x11, (0x18), 0x01, (0x1A, 0x18), 0xA8, 0xEE
  - platform: rs485
    name: "Livingroom Heater"
    visual:
      min_temperature: 10 °C
      max_temperature: 40 °C
      temperature_step: 1 °C
    device: [0x22, 0x01, 0x18, 0x04, 0x46, 0x10, 0x00]
    state_current: #Required (현재온도 State, RS485 Sensor 설정 참고, sensor:로 대체 가능)
      offset: 8
      length: 1
      precision: 0
    state_target: #Required (설정온도 State)
      offset: 9
      length: 1
      precision: 0
    state_off: #Required (끄기 상태)
      offset: 7
      data: [0x04]
    state_heat: #Option (난방모드, 냉방모드: state_cool, 자동모드: state_auto)
      offset: 7
      data: [0x01]
    state_away: #Option (외출모드)
      offset: 7
      data: [0x07]
    command_off: #Required (끄기 명령)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, 0x04, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, 0x04, 0x04]
    command_heat: #Option (난방모드 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, 0x01, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, 0x01, 0x01]
    command_away: #Option (외출 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, 0x07, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, 0x07, 0x07]
    command_temperature: !lambda |-  #Required (온도 조절)
      // @param: const float x
      return {
                {0x0B, 0x01, 0x18, 0x02, 0x46, 0x11, (uint8_t)x, 0x00},
                {0x0D, 0x01, 0x18, 0x04, 0x46, 0x11, (uint8_t)x, 0x01}
             };
             
#    command_state: [0x0B, 0x01, 0x18, 0x01, 0x46, 0x11, 0x00, 0x00] #Option
#    update_interval: 701s #Option(default: 60s)
 #0xF7, 0x0B, 0x01, 0x18, 0x01, 0x46, 0x10, 0x00, 0x00, 0xB2, 0xEE
 #0xF7, 0x22, 0x01, 0x18, 0x04, 0x46, 0x10, 0x00, 0x01, 0x15, 0x15, 0x01, 0x15, 0x16, 0x04, 0x13, 0x17, 0x04, 0x16, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0


  # [안방] 0x12
  # (현재온도 외부 센서 사용 샘플)
  - platform: rs485
    name: "Bedroom Heater"
    visual:
      min_temperature: 10 °C
      max_temperature: 40 °C
      temperature_step: 1 °C
    device: [0x22, 0x01, 0x18, 0x04, 0x46, 0x10, 0x00]
    state_current: #Required (현재온도 State, RS485 Sensor 설정 참고, sensor:로 대체 가능)
      offset: 11
      length: 1
      precision: 0
    state_target:
      offset: 12
      length: 1
      precision: 0
    state_off:
      offset: 10
      data: [0x04]
    state_heat:
      offset: 10
      data: [0x01]
    state_away:
      offset: 10
      data: [0x07]
    command_off: #Required (끄기 명령)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x12, 0x04, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x12, 0x04, 0x04]
    command_heat: #Option (난방모드 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x12, 0x01, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x12, 0x01, 0x01]
    command_away: #Option (외출 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x12, 0x07, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x12, 0x07, 0x07]
    command_temperature: !lambda |-  #Required (온도 조절)
      // @param: const float x
      return {
                {0x0B, 0x01, 0x18, 0x02, 0x46, 0x12, (uint8_t)x, 0x00},
                {0x0D, 0x01, 0x18, 0x04, 0x46, 0x12, (uint8_t)x, 0x01}
             };
#    command_state: [0x0B, 0x01, 0x18, 0x01, 0x46, 0x12, 0x00, 0x00] #Option
#    update_interval: 709s #Option(default: 60s)

  # [작은방] 0x14
  - platform: rs485
    name: "Room3 Heater"
    visual:
      min_temperature: 10 °C
      max_temperature: 40 °C
      temperature_step: 1 °C
    device: [0x22, 0x01, 0x18, 0x04, 0x46, 0x10, 0x00]
    state_current: #Required (현재온도 State, RS485 Sensor 설정 참고, sensor:로 대체 가능)
      offset: 14
      length: 1
      precision: 0
    state_target:
      offset: 15
      length: 1
      precision: 0
    state_off:
      offset: 13
      data: [0x04]
    state_heat:
      offset: 13
      data: [0x01]
    state_away:
      offset: 13
      data: [0x07]
    command_off: #Required (끄기 명령)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x13, 0x04, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x13, 0x04, 0x04]
    command_heat: #Option (난방모드 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x13, 0x01, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x13, 0x01, 0x01]
    command_away: #Option (외출 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x13, 0x07, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x13, 0x07, 0x07]
    command_temperature: !lambda |-  #Required (온도 조절)
      // @param: const float x
      return {
                {0x0B, 0x01, 0x18, 0x02, 0x46, 0x13, (uint8_t)x, 0x00},
                {0x0D, 0x01, 0x18, 0x04, 0x46, 0x13, (uint8_t)x, 0x01}
             };
#    command_state: [0x0B, 0x01, 0x18, 0x01, 0x46, 0x13, 0x00, 0x00] #Option
#    update_interval: 719s #Option(default: 60s)

  # [컴퓨터방] 0x13
  - platform: rs485
    name: "Computer Room Heater"
    visual:
      min_temperature: 10 °C
      max_temperature: 40 °C
      temperature_step: 1 °C
    device: [0x22, 0x01, 0x18, 0x04, 0x46, 0x10, 0x00]
    state_current:
      offset: 17
      length: 1
      precision: 0
    state_target:
      offset: 18
      length: 1
      precision: 0
    state_off:
      offset: 16
      data: [0x04]
    state_heat:
      offset: 16
      data: [0x01]
    state_away:
      offset: 16
      data: [0x07]
    command_off: #Required (끄기 명령)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, 0x04, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x14, 0x04, 0x04]
    command_heat: #Option (난방모드 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, 0x01, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x14, 0x01, 0x01]
    command_away: #Option (외출 켜기)
      data: [0x0B, 0x01, 0x18, 0x02, 0x46, 0x14, 0x07, 0x00]
      ack: [0x0D, 0x01, 0x18, 0x04, 0x46, 0x14, 0x07, 0x07]
    command_temperature: !lambda |-  #Required (온도 조절)
      // @param: const float x
      return {
                {0x0B, 0x01, 0x18, 0x02, 0x45, 0x14, (uint8_t)x, 0x00},
                {0x0D, 0x01, 0x18, 0x04, 0x45, 0x14, (uint8_t)x, 0x01}
             };
#    command_state: [0x0B, 0x01, 0x18, 0x01, 0x46, 0x14, 0x00, 0x00] #Option
#    update_interval: 727s #Option(default: 60s)
반응형

+ Recent posts