함수명 | 목적 | 의의 |
---|---|---|
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로 발행. | 지속적인 상태 업데이트로 클라이언트와의 데이터 동기화 유지. |
- 시리얼 포트 설정:
- RS485 통신에 필요한 포트를 설정 (
/dev/ttyUSB0
). baudrate
,bytesize
,parity
,stopbits
와 같은 세부 통신 설정 포함.
- RS485 통신에 필요한 포트를 설정 (
- MQTT 브로커 연결:
- IoT 통신을 위해 MQTT 브로커 정보(
server
,port
,user
,passwd
)를 설정.
- IoT 통신을 위해 MQTT 브로커 정보(
- 로깅 초기화:
- 로그를 파일(
wosds_wallpad.log
)과 콘솔로 출력하도록 설정.
- 로그를 파일(
initialize_serial
함수를 호출해 RS485 연결 초기화.- 설정된 직렬 포트(
/dev/ttyUSB0
)를 열고 연결 상태 확인. - 실패 시 예외 처리.
- 설정된 직렬 포트(
connect_mqtt
함수를 호출해 MQTT 브로커에 연결.- 연결 성공 시 메시지 루프 시작 (
loop_start
). - MQTT 브로커에서 메시지를 수신할 준비.
- 연결 성공 시 메시지 루프 시작 (
initial_status_update
호출:- 모든 조명 상태를 업데이트.
- 난방 그룹(1~4)의 상태를 각각 업데이트.
- 초기 상태를 MQTT 브로커로 발행해 클라이언트와 동기화.
periodic_status_update
함수 실행:- 별도의 쓰레드에서 5초 간격으로 실행.
- 모든 조명과 난방 상태를 요청 및 업데이트.
- 최신 상태를 MQTT로 발행.
- 사용자는 MQTT 클라이언트를 통해 메시지 발행:
- 예:
wosds/light/1
에 "1"을 발행하면 조명 1번이 켜짐. - 예:
wosds/heating/2
에 "0"을 발행하면 난방 2번이 꺼짐.
- 예:
on_message
함수가 MQTT 메시지를 수신:- 메시지 토픽과 페이로드를 파싱.
- 해당 명령(
control_light
또는control_heating
)을 호출.
control_light
또는control_heating
이 호출:- RS485 패킷 생성 후 체크섬 계산.
send_rs485_command
를 통해 장치에 패킷 송신.- 응답 데이터를 처리해 상태 업데이트.
- 상태 변화가 있으면 MQTT로 상태를 발행:
- 예:
wosds/light/1/status
에 최신 상태 발행.
- 예:
- 프로그램 종료 시:
KeyboardInterrupt
를 감지.- MQTT 루프 중단 및 RS485 연결 닫기.
구분 | 송신 패킷 | 예시 응답 패킷 | 설명 |
---|---|---|---|
난방 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: 체크섬 |
구분 | 송신 패킷 | 응답 패킷 | 조명 상태 |
---|---|---|---|
조명 상태 요청 | 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: 켜짐 |
- 난방 패킷:
- 송신 패킷(
AE 7C ...
)은 난방 그룹 ID와 요청 데이터를 포함. - 응답 패킷(
B0 7C ...
)은 그룹 ID, 켜짐/꺼짐 상태, 설정 온도, 현재 온도를 포함.
- 송신 패킷(
- 조명 패킷:
- 송신 패킷(
AC 79 00 01 54
)을 통해 모든 조명의 상태 요청. - 응답 패킷의 특정 비트(3번째 바이트)를 확인하여 각 조명의 상태를 판별.
- 송신 패킷(
구분 | 설명 | 토픽 예시 | 메시지 페이로드 예시 | 결과 |
---|---|---|---|---|
조명 켜기 | 특정 조명 그룹을 켬 | wosds/light/1 | 1 | 조명 1번 켜짐 |
조명 끄기 | 특정 조명 그룹을 끔 | wosds/light/1 | 0 | 조명 1번 꺼짐 |
조명 2 켜기 | 조명 2번 그룹을 켬 | wosds/light/2 | 1 | 조명 2번 켜짐 |
조명 3 끄기 | 조명 3번 그룹을 끔 | wosds/light/3 | 0 | 조명 3번 꺼짐 |
구분 | 설명 | 토픽 예시 | 메시지 페이로드 예시 | 결과 |
---|---|---|---|---|
난방 켜기 | 특정 난방 그룹을 켜기 | 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번의 예약 상태 해제 |
- MQTT 클라이언트 준비: MQTT 클라이언트를 설정하고 브로커에 연결합니다. 예:
client = mqtt.Client()
client.username_pw_set("user", "password")
client.connect("mqtt_broker_ip", 1883)
- 토픽과 페이로드 발행: 원하는 토픽과 메시지 페이로드를 발행합니다. 예:
# 조명 1 켜기
client.publish("wosds/light/1", "1")
# 난방 1 끄기
client.publish("wosds/heating/1", "0")
# 난방 2 온도를 23°C로 설정
client.publish("wosds/heating/2", "1,23")
작업 | 토픽 | 페이로드 | 설명 |
---|---|---|---|
조명 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 토픽 형식:
- 난방 제어:
- MQTT 토픽 형식:
wosds/heating/<group_id>
(group_id는 1~4 중 하나). - 메시지 페이로드:
*1
: 켜기.
*0
: 끄기.
*1,<온도>
: 켜고 온도 설정 (예:1,22
는 22°C로 설정 후 켜짐).
*<온도>
: 온도만 설정 (예:22
는 22°C로 설정).
- MQTT 토픽 형식: