MMCL/SOURCE/agents/delphi_nilm_agent/Win32/Debug/01. NILM Agent MQTT 구독 및 데이터 적재 자동화.txt
2026-09-04 11:27:31 +09:00

46 lines
2.8 KiB
Plaintext

# NILM Agent MQTT 구독 및 데이터 적재 자동화 계획
NILM Agent가 시작될 때 데이터베이스에서 NILM 센서들의 MQTT 토픽 정보를 읽어와 자동으로 구독(Subscribe)하고, 메시지 수신 시 매칭되는 센서 번호로 DB에 저장하도록 구현하는 계획입니다.
## User Review Required
> [!WARNING]
> 현재 MariaDB의 `sensor_info` 테이블에는 MQTT 토픽을 저장하는 컬럼이 없습니다. (과거 설계인 `schema.sql`에도 없음)
> 따라서 `sensor_info` 테이블에 `mqtt_topic` 이라는 컬럼을 추가하는 DB 마이그레이션이 먼저 필요합니다. 이 컬럼을 추가해도 괜찮으신지 확인 부탁드립니다.
## Proposed Changes
### 1. Database (MariaDB)
`sensor_info` 테이블에 MQTT 토픽을 저장할 수 있는 컬럼을 추가합니다.
```sql
ALTER TABLE sensor_info ADD COLUMN mqtt_topic VARCHAR(100) NULL AFTER _desc;
```
*테스트를 위해 기존 센서(101번)에 임시 토픽(예: `nilm/sensor1`)을 부여할 예정입니다.*
### 2. Delphi Agent (`agents/delphi_nilm_agent/uMain.pas`)
#### [MODIFY] uMain.pas
* **멤버 변수 추가**:
* `FClient: TMQTTClient;` 추가 및 `UMQTTClient` uses 절 포함.
* 토픽과 센서 번호를 매핑하기 위한 `FTopicSensorMap: TDictionary<string, Integer>;` 추가.
* **`btnStartClick` 로직 변경**:
1. DB 연동 (`SetupDatabase`)
2. `sensor_info` 테이블에서 `sensor_typeid = 1` 이고 `mqtt_topic`이 있는 센서 번호(sensor_no)와 토픽 조회.
3. 조회된 정보를 `FTopicSensorMap`에 저장.
4. `TMQTTClient` 객체를 생성하고 MQTT 브로커(host, port)에 연결.
5. 맵에 저장된 모든 토픽들에 대해 `Subscribe` 명령 수행.
* **`OnMqttMessageReceived` 로직 변경**:
* 기존에 하드코딩된 `101` 대신, 수신된 `Topic`을 `FTopicSensorMap`에서 찾아 해당하는 실제 `sensor_no`로 `InsertNilmData` 호출.
* **`btnStopClick` 및 Form 닫기 처리**:
* `FClient.Disconnect;`, 맵 객체(`FTopicSensorMap`) 및 클라이언트 해제 로직 추가로 메모리 누수 방지.
## Verification Plan
### Automated/Manual Verification
1. 파이썬 스크립트 등을 통해 MySQL에 접속하여 `sensor_info` 테이블에 `mqtt_topic` 컬럼이 추가되었는지 확인.
2. 101번 센서에 테스트용 토픽 업데이트 (`UPDATE sensor_info SET mqtt_topic = 'test/nilm/101' WHERE sensor_no = 101;`).
3. 델파이 IDE에서 `NilmMQTT_Agent` 프로젝트를 열고 컴파일 후 실행.
4. "Start Agent" 버튼 클릭 시, 콘솔(Memo) 창에 MQTT 접속 및 해당 토픽 구독 성공 메시지가 뜨는지 확인.
5. 임시 MQTT 클라이언트(MQTT.fx 등)로 `test/nilm/101` 토픽에 JSON 데이터를 Publish.
6. DB(`sensor_history_log` 및 `sensor_info`)에 값이 정상적으로 INSERT/UPDATE 되는지 확인.