Skip to content

삼성SDS 월패드(SHT-7307XM) 없이도 댁내 RS485 통신기반 디바이스(조명, 난방)의 상태를 조회하고, 조절기능을 구현하기 위한 소스

Notifications You must be signed in to change notification settings

ohnggni/rs485-control-wo-sds-wallpad

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 

Repository files navigation

1. 각 함수의 목적과 의의

함수명 목적 의의
send_rs485_command RS485 패킷을 송신하고 응답을 수신. 재시도를 통해 안정적인 통신 보장. RS485 장치와의 신뢰성 있는 통신을 담당하여 조명과 난방 제어의 핵심 역할을 함.
initialize_serial RS485 통신을 위한 직렬 연결 초기화. 하드웨어 통신 초기화로 안정적인 시작을 보장.
connect_mqtt MQTT 브로커에 연결. IoT 통신의 핵심으로, RS485 데이터와 MQTT 메시지의 중계 역할을 함.
request_light_status 조명 상태를 요청하는 RS485 패킷 송신 및 응답 처리. 조명의 현재 상태를 확인하여 클라이언트로 정보를 제공하는 데 사용.
update_light_status 요청된 조명 상태를 MQTT로 발행하고 로컬 상태를 업데이트. 조명의 상태를 최신으로 유지하고 클라이언트와 동기화.
request_heating_status 특정 난방 그룹 상태 요청 RS485 패킷 송신 및 응답 처리. 난방 상태 데이터를 수집하여 제어와 상태 업데이트를 지원.
update_heating_status 난방 상태를 MQTT로 발행하고 로컬 상태를 업데이트. 난방 상태를 최신 상태로 유지하고 클라이언트와 동기화.
parse_heating_status 난방 상태 응답 데이터를 파싱하여 그룹 ID, 상태, 설정 온도, 현재 온도를 추출. RS485 응답 데이터를 구조적으로 처리하여 난방 상태를 이해할 수 있도록 도움.
calculate_checksum RS485 패킷의 체크섬 계산. 패킷 무결성을 보장하여 통신 오류를 방지.
on_message MQTT 메시지 수신 시 조명/난방 제어 및 처리. 외부에서 제어 명령을 수신하여 실제 하드웨어에 적용.
control_light 특정 조명 그룹을 켜거나 끄는 RS485 제어 패킷 송신. 클라이언트에서 받은 명령을 통해 조명을 실시간으로 제어.
control_heating 특정 난방 그룹의 온도를 설정하거나 전원을 제어하는 RS485 패킷 송신. 난방 그룹 제어를 실시간으로 처리하여 편리한 난방 관리 제공.
subscribe_topics 조명 및 난방 관련 MQTT 토픽 구독. 제어 명령 및 상태 동기화를 위해 필요한 메시지 수신 채널 설정.
initial_status_update 시스템 초기화 시 조명 및 난방 상태를 업데이트. 초기 상태를 동기화하여 시스템이 올바른 상태로 시작하도록 보장.
periodic_status_update 조명 및 난방 상태를 주기적으로 업데이트하고 MQTT로 발행. 지속적인 상태 업데이트로 클라이언트와의 데이터 동기화 유지.

2. 전체적인 작동 원리와 알고리즘

1단계: 환경 설정

  1. 시리얼 포트 설정:
    • RS485 통신에 필요한 포트를 설정 (/dev/ttyUSB0).
    • baudrate, bytesize, parity, stopbits와 같은 세부 통신 설정 포함.
  2. MQTT 브로커 연결:
    • IoT 통신을 위해 MQTT 브로커 정보(server, port, user, passwd)를 설정.
  3. 로깅 초기화:
    • 로그를 파일(wosds_wallpad.log)과 콘솔로 출력하도록 설정.

2단계: RS485 초기화

  1. initialize_serial 함수를 호출해 RS485 연결 초기화.
    • 설정된 직렬 포트(/dev/ttyUSB0)를 열고 연결 상태 확인.
    • 실패 시 예외 처리.

3단계: MQTT 연결

  1. connect_mqtt 함수를 호출해 MQTT 브로커에 연결.
    • 연결 성공 시 메시지 루프 시작 (loop_start).
    • MQTT 브로커에서 메시지를 수신할 준비.

4단계: 초기 상태 동기화

  1. initial_status_update 호출:
    • 모든 조명 상태를 업데이트.
    • 난방 그룹(1~4)의 상태를 각각 업데이트.
  2. 초기 상태를 MQTT 브로커로 발행해 클라이언트와 동기화.

5단계: 주기적 상태 업데이트

  1. periodic_status_update 함수 실행:
    • 별도의 쓰레드에서 5초 간격으로 실행.
    • 모든 조명과 난방 상태를 요청 및 업데이트.
    • 최신 상태를 MQTT로 발행.

6단계: 사용자 제어

  1. 사용자는 MQTT 클라이언트를 통해 메시지 발행:
    • 예: wosds/light/1에 "1"을 발행하면 조명 1번이 켜짐.
    • 예: wosds/heating/2에 "0"을 발행하면 난방 2번이 꺼짐.
  2. on_message 함수가 MQTT 메시지를 수신:
    • 메시지 토픽과 페이로드를 파싱.
    • 해당 명령(control_light 또는 control_heating)을 호출.

7단계: RS485 통신 및 동작

  1. control_light 또는 control_heating이 호출:
    • RS485 패킷 생성 후 체크섬 계산.
    • send_rs485_command를 통해 장치에 패킷 송신.
    • 응답 데이터를 처리해 상태 업데이트.
  2. 상태 변화가 있으면 MQTT로 상태를 발행:
    • 예: wosds/light/1/status에 최신 상태 발행.

8단계: 시스템 종료

  1. 프로그램 종료 시:
    • KeyboardInterrupt를 감지.
    • MQTT 루프 중단 및 RS485 연결 닫기.

3. RS485 패킷 설명 표

1. 난방 상태 패킷

구분 송신 패킷 예시 응답 패킷 설명
난방 1번 AE 7C 01 00 00 00 00 53 B0 7C 01 00 18 15 FF 3F 01: 난방 그룹 ID00: 꺼짐 상태18: 설정 온도 (24°C)15: 현재 온도 (21°C)FF: 예약 상태3F: 체크섬
난방 2번 AE 7C 02 00 00 00 00 50 B0 7C 02 01 1A 14 FF 3E 02: 난방 그룹 ID01: 켜짐 상태1A: 설정 온도 (26°C)14: 현재 온도 (20°C)FF: 예약 상태3E: 체크섬
난방 3번 AE 7C 03 00 00 00 00 51 B0 7C 03 00 16 10 FF 36 03: 난방 그룹 ID00: 꺼짐 상태16: 설정 온도 (22°C)10: 현재 온도 (16°C)FF: 예약 상태36: 체크섬
난방 4번 AE 7C 04 00 00 00 00 56 B0 7C 04 01 17 15 FF 34 04: 난방 그룹 ID01: 켜짐 상태17: 설정 온도 (23°C)15: 현재 온도 (21°C)FF: 예약 상태34: 체크섬

2. 조명 상태 패킷

구분 송신 패킷 응답 패킷 조명 상태
조명 상태 요청 AC 79 00 01 54 조명 상태 요청 패킷. 응답으로 상태 확인 가능.
응답 예시 B0 79 31 00 78 조명 1: 꺼짐, 조명 2: 꺼짐, 조명 3: 꺼짐
B0 79 31 01 79 조명 1: 켜짐, 조명 2: 꺼짐, 조명 3: 꺼짐
B0 79 31 02 7A 조명 1: 꺼짐, 조명 2: 켜짐, 조명 3: 꺼짐
B0 79 31 03 7B 조명 1: 켜짐, 조명 2: 켜짐, 조명 3: 꺼짐
B0 79 31 04 7C 조명 1: 꺼짐, 조명 2: 꺼짐, 조명 3: 켜짐
B0 79 31 05 7D 조명 1: 켜짐, 조명 2: 꺼짐, 조명 3: 켜짐
B0 79 31 06 7E 조명 1: 꺼짐, 조명 2: 켜짐, 조명 3: 켜짐
B0 79 31 07 7F 조명 1: 켜짐, 조명 2: 켜짐, 조명 3: 켜짐

추가 설명

  1. 난방 패킷:
    • 송신 패킷(AE 7C ...)은 난방 그룹 ID와 요청 데이터를 포함.
    • 응답 패킷(B0 7C ...)은 그룹 ID, 켜짐/꺼짐 상태, 설정 온도, 현재 온도를 포함.
  2. 조명 패킷:
    • 송신 패킷(AC 79 00 01 54)을 통해 모든 조명의 상태 요청.
    • 응답 패킷의 특정 비트(3번째 바이트)를 확인하여 각 조명의 상태를 판별.

4. MQTT를 이용한 각 기능별 패킷 발행 튜토리얼

a. 조명 제어

구분 설명 토픽 예시 메시지 페이로드 예시 결과
조명 켜기 특정 조명 그룹을 켬 wosds/light/1 1 조명 1번 켜짐
조명 끄기 특정 조명 그룹을 끔 wosds/light/1 0 조명 1번 꺼짐
조명 2 켜기 조명 2번 그룹을 켬 wosds/light/2 1 조명 2번 켜짐
조명 3 끄기 조명 3번 그룹을 끔 wosds/light/3 0 조명 3번 꺼짐

b. 난방 제어

구분 설명 토픽 예시 메시지 페이로드 예시 결과
난방 켜기 특정 난방 그룹을 켜기 wosds/heating/1 1 난방 1번 켜짐
난방 끄기 특정 난방 그룹을 끄기 wosds/heating/1 0 난방 1번 꺼짐
난방 2 켜기 난방 2번 그룹을 켜기 wosds/heating/2 1 난방 2번 켜짐
난방 3 끄기 난방 3번 그룹을 끄기 wosds/heating/3 0 난방 3번 꺼짐
난방 온도 설정 특정 난방 그룹의 설정 온도를 변경 wosds/heating/1 1,22 난방 1번 켜짐 및 설정 온도를 22°C로 변경
난방 온도 변경 특정 난방 그룹의 온도를 끄지 않고 변경 wosds/heating/2 22 난방 2번의 설정 온도를 22°C로 설정 (켜짐 상태 유지)
난방 예약 끄기 특정 난방 그룹의 예약 상태를 끄기 wosds/heating/4 0 난방 4번의 예약 상태 해제

c. MQTT 발행 프로세스

  1. MQTT 클라이언트 준비: MQTT 클라이언트를 설정하고 브로커에 연결합니다. 예:
client = mqtt.Client()  
client.username_pw_set("user", "password")  
client.connect("mqtt_broker_ip", 1883)  
  1. 토픽과 페이로드 발행: 원하는 토픽과 메시지 페이로드를 발행합니다. 예:
# 조명 1 켜기  
client.publish("wosds/light/1", "1")  
# 난방 1 끄기  
client.publish("wosds/heating/1", "0")  
# 난방 2 온도를 23°C로 설정  
client.publish("wosds/heating/2", "1,23")  

d. 조명/난방 통합 예시

작업 토픽 페이로드 설명
조명 1번 켜기 wosds/light/1 1 조명 1번 켜짐
조명 2번 끄기 wosds/light/2 0 조명 2번 꺼짐
난방 3번 켜기 및 25°C 설정 wosds/heating/3 1,25 난방 3번 켜지고 온도 25°C로 설정
난방 4번 끄기 wosds/heating/4 0 난방 4번 꺼짐

추가 참고 사항

  • 조명 제어:
    • MQTT 토픽 형식: wosds/light/<group_id> (group_id는 1, 2, 3 중 하나).
    • 메시지 페이로드: 1 (켜기) 또는 0 (끄기).
  • 난방 제어:
    • MQTT 토픽 형식: wosds/heating/<group_id> (group_id는 1~4 중 하나).
    • 메시지 페이로드:
      * 1: 켜기.
      * 0: 끄기.
      * 1,<온도>: 켜고 온도 설정 (예: 1,22는 22°C로 설정 후 켜짐).
      * <온도>: 온도만 설정 (예: 22는 22°C로 설정).

About

삼성SDS 월패드(SHT-7307XM) 없이도 댁내 RS485 통신기반 디바이스(조명, 난방)의 상태를 조회하고, 조절기능을 구현하기 위한 소스

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages