장치 명령 처리와 메시지 연동

학습 목표

메신저·웹·장치 버스가 달라도 같은 명령 처리 규칙을 재사용할 수 있도록 입력·상태·응답을 나눕니다.

실행 조건

기본 활동은 Python만 사용합니다. 실제 메신저·MQTT 연결은 처리 규칙을 확인한 뒤 선택합니다.

명령과 State Transition

시작 조건

입력은 /start, /led on, /led off, /led invalid, /unknown입니다. 초기 LED 상태는 off입니다.

진행 방법

  1. handle(text,state)가 새 상태와 응답 문장을 반환하도록 작성하세요.
  2. 입력 목록을 순서대로 처리하고 각 단계의 전후 상태를 기록하세요.
  3. 잘못된 인수와 알 수 없는 명령은 상태를 유지하고 사용법을 반환하세요.

남길 결과

def handle(text,state):
    if text=='/start':return state,'Commands: /led on, /led off'
    if text=='/led on':return True,'LED on'
    if text=='/led off':return False,'LED off'
    return state,'Usage: /led on | /led off'
state=False
for text in ['/start','/led on','/led off','/led invalid','/unknown']:
    next_state,reply=handle(text,state);print(text,state,next_state,reply);state=next_state

결과 기록·자가 점검

입력:

이전 상태:

다음 상태:

응답:

확인할 점

반복 명령과 공백

시작 조건

/led on을 세 번 반복하고, 앞뒤 공백이 있는 ” /led off “를 추가합니다.

진행 방법

  1. 반복 명령을 처리했을 때 상태가 유지되는지 확인하세요.
  2. strip·대소문자 처리 규칙을 정한 뒤 원 함수와 비교하세요.
  3. 허용하지 않을 입력도 두 개 골라 상태 보존을 검사하세요.

남길 결과

tests=['/led on','/led on','/led on',' /led off ','/LED ON','']
# TODO: 정규화한 처리 함수와 원본을 비교하세요.

결과 기록·자가 점검

입력:

정규화 결과:

상태:

허용 여부:

확인할 점

전송 방식과 장치 로직 분리

Week14-2_Telegram_Bot_Command_Handler.py와 이 Notebook의 handle·dispatch를 읽고, 각 역할에 해당하는 함수나 줄을 표에 연결하세요. 원본에 없는 역할은 ‘없음’으로 표시하고 테스트용 구현과 구분합니다.

실제 메시지 전송 대신 제공된 outbox 로그를 사용합니다.

시작 조건

웹·메신저·MQTT에서 온 입력을 {request_id,device,command} 형태로 정리합니다. 같은 request_id는 다시 실행하지 않습니다.

진행 방법

  1. 요청 ID·장치·명령을 검증한 뒤 공통 처리 함수에 전달하세요.
  2. 동일 요청을 두 번 보내도 상태 변경은 한 번만 일어나도록 처리하세요.
  3. 응답과 실제 상태를 기록해 요청–처리–응답 흐름을 그리세요.

남길 결과

seen=set();outbox=[]
def dispatch(message):
    if message['request_id'] in seen:return 'duplicate'
    seen.add(message['request_id']);outbox.append(dict(message));return 'accepted'
message={'request_id':'r1','device':'fan','command':'on'}
print(dispatch(message),dispatch(message),outbox)
# TODO: 잘못된 device·command가 seen에 들어가기 전에 검증하세요.

결과 기록·자가 점검

역할:

원본 함수·위치:

테스트용 대체:

확인한 결과:

확인할 점