SungjuNewPrime/NILM_Agent/AgentNILM_MQTTClient(Delphi13 VCL)/Docs/20260729_1_NILM MQTT JSON 구조 변경 및 전체 시스템 적용 계획.txt
2026-09-04 11:15:47 +09:00

58 lines
4.6 KiB
Plaintext

# NILM MQTT JSON 구조 변경 및 전체 시스템 적용 계획
전달해주신 이미지의 새로운 JSON 키(ADE9430 기반 전력 데이터) 구조 반영과 추가로 요청하신 **3상 3선식(3P3W) / 3상 4선식(3P4W)** 지원을 프로그램 전체에 반영하기 위한 상세 구현 계획입니다.
## User Review Required
> [!WARNING]
> 이 작업은 데이터베이스 스키마(테이블 구조) 변경을 포함합니다. 기존 테이블에 있던 `v_l1`, `i_l1` 등의 컬럼명을 새로운 규칙에 맞게 `vrms_a`, `irms_a` 등으로 일괄 변경(Rename)하고 부족한 컬럼(에너지, THD 등)을 추가할 예정입니다.
> [!IMPORTANT]
> **질문 1:** 이미지에 가속도/자이로 센서 데이터(acc_x, gyro_x 등)나 피크 전류(pk_l1) 정보가 없습니다. 해당 필드들은 DB에 그대로 유지하되, MQTT에서 값이 들어오지 않으면 기존 값을 유지(또는 0으로 처리)하도록 할까요? (만약 아예 사용하지 않는다면 화면과 DB에서 숨김/제거 처리할 수 있습니다.)
> **질문 2:** 이미지에는 `temperature` 항목이 하나만 있습니다. 기존의 내부 온도(`temp_int`)를 `temperature`로 매핑하고 `temp_ext`는 비워둘까요?
> **질문 3:** 기존에는 일일 전력량(`Energy_Day`)을 직접 계산했는데, 이제 `active_energy_import_a` 값이 넘어옵니다. 화면의 전력량 값으로 이 넘어온 값을 그대로 출력하도록 대체할까요?
## Proposed Changes
### 1. 결선 방식 (3선식 / 4선식) 지원 추가
* **장비 설정 (uNILMDeviceForm, uNILMTypes)**:
* 기존 `PhaseType`의 선택지를 `SINGLE`(단상), `3PHASE`(기존 3상)에서 **`SINGLE`(단상), `3P3W`(3상 3선식), `3P4W`(3상 4선식)**으로 확장합니다.
* **UI 및 라벨링 변경 (uMain)**:
* 장비가 `3P3W`로 설정된 경우, 전압 라벨을 상간 전압인 `V_RS`, `V_ST`, `V_TR` (기준전압 380V)로 표시합니다.
* 장비가 `3P4W`로 설정된 경우, 전압 라벨을 선간(상) 전압인 `V_RN`, `V_SN`, `V_TN` (기준전압 220V)로 표시합니다.
* *참고: 센서에서 보내주는 JSON 키는 `vrms_a`, `vrms_b`, `vrms_c`로 동일하게 넘어오지만, 화면에 보여주는 명칭과 모니터링 기준을 다르게 셋팅합니다.*
### 2. 데이터베이스 스키마 변경 (uNILMManager.pas)
* `nilm_device` 테이블: `phase_type` 컬럼이 `3P3W`나 `3P4W`를 가질 수 있도록 호환성 유지.
* `nilm_data` 및 `nilm_data_history` 테이블의 기존 컬럼명을 PostgreSQL `ALTER TABLE RENAME`을 통해 아래와 같이 변경합니다.
* `v_l1` ➔ `vrms_a`
* `i_l1` ➔ `irms_a`
* `w_l1` ➔ `active_power_a`
* `var_l1` ➔ `reactive_power_a`
* `va_l1` ➔ `apparent_power_a`
* `pf_l1` ➔ `power_factor_a`
* (L2➔b, L3➔c 상에 대해서도 일괄 변경)
* **신규 컬럼 추가**: `phase_angle_a/b/c`, `vthd_a/b/c`, `ithd_a/b/c`, `active_energy_import_a/b/c`, `active_energy_export_a/b/c`, `reactive_energy_import_a/b/c`, `reactive_energy_export_a/b/c`, `apparent_energy_a/b/c`, `frequency`, `temperature`, `event_flags` 등 명시된 모든 신규 항목 추가.
### 3. 내부 데이터 구조체 변경 (uMain.pas, uNILMTypes.pas)
* `uMain.pas`의 `TNILMItem` 클래스 내 변수명(`voltageA`, `currentA` 등)을 `vrms_a`, `irms_a` 등 새 이름으로 교체하고 신규 속성을 추가합니다.
* `uNILMTypes.pas`의 센서 매핑 키 상수를 `vrms_a` 등 새로운 형식에 맞게 수정합니다.
### 4. MQTT 파싱 로직 및 UI 그리드 업데이트 (uMain.pas)
* `ProcessMQTTMessage`에서 JSON을 파싱할 때 새로운 키(`vrms_a`, `active_power_a` 등)를 읽도록 수정합니다.
* `grdMQTTMonitor` 그리드의 열(Column) 개수를 늘리고, 헤더를 새로운 항목 이름으로 변경하여 신규 데이터(THD, 에너지 등)도 모니터링 가능하게 확장합니다.
### 5. 차트(Chart) 및 그리드 표시 수정 (uMain.pas)
* History 화면의 차트에서 값을 불러올 때 `Q.FieldByName('v_l1')`으로 호출하던 코드를 `Q.FieldByName('vrms_a')`로 수정합니다.
## Verification Plan
### Automated/Code Verification
* 소스 코드 전반에서 구형 변수명(`v_l1`, `pfA` 등)이 남아있는지 정규표현식(FindStr)으로 철저히 검사.
* 변경된 SQL DDL이 문법적 오류 없이 정상 실행되는지 확인.
### Manual Verification
* 대표님께서 프로그램 실행 후 장비 수정 창에서 `3상 3선식`, `3상 4선식` 선택이 가능한지 확인.
* 선택한 결선 방식에 따라 전압 명칭이 다르게 나타나는지 확인.
* 새로운 값들(THD, 에너지 등)이 에러 없이 DB에 저장되고 그리드에 표출되는지 확인.