GitHub ↗
← 모든 프로젝트
데스크톱 · 장치 모니터링

활선안전경보기 모니터링

Python BLE 수집·SQLite 저장·PyQt5 모니터링 프로그램에 Vite·React·TypeScript 기반 디자인 개편 화면을 구성한 프로젝트. 상황판·상세정보·기준설정과 상태 시나리오를 제공합니다.

ViteReactTypeScriptPythonPyQt5BLEBleakSQLiteMatplotlibNumPySQLasyncio모니터링DBMSDB 설계
DBMS
SQLite · 관계형 DBMS
DB 설계 담당
측정 이력·패널 상태·이벤트·설정 테이블과 시간·패널별 조회 구조 설계
활선안전경보기 Vite 디자인 개편 상황판 실행 화면 · 데모 데이터
01 / PROBLEM & GOALS

문제/목표 — 왜 만들었는가

장치 데이터 수집부터 상태 표시와 이력 분석까지

활선안전경보기의 패널 정보를 BLE로 수집하고 Python 데스크톱 화면에서 모니터링하는 프로그램입니다. 수집·저장·통신 상태 처리와 UI 갱신을 분리하고 측정 이력을 그래프와 통계로 확인하도록 구성했습니다. Vite·React·TypeScript 디자인 버전에서는 상황판·상세정보·기준설정과 상태 시나리오를 브라우저 화면으로 구성했습니다.

프로그램
활선안전경보기 패널 모니터링
사용 환경
Python · PyQt5 / Vite · React · TypeScript 디자인 UI
데이터 저장
SQLite · 관계형 SQL DB

기존 문제

여러 패널의 측정값과 통신 상태를 확인하고, 이상 상태와 과거 기록을 함께 살펴볼 필요가 있었습니다. 순차 수집 흐름에서는 데이터 처리나 DB 잠금 대기가 다음 스캔을 지연시킬 수 있었습니다.

사용자가 필요로 한 것

사용자가 패널별 상태를 요약·상세 화면에서 확인하고 연결 끊김과 이벤트 이력을 살펴보며, 기간별 데이터를 그래프와 CSV로 조회할 수 있어야 합니다.

목표

패널 상태와 측정값 확인

전압·온도·습도·패널 내부 온도·도어·부분방전 정보를 수집하고 요약 카드와 상세 표로 표시합니다.

수집과 저장 흐름 분리

BLE 광고 수신은 큐에 데이터를 전달하고 DB 쓰기와 타임아웃 확인은 별도 비동기 태스크로 처리하도록 구성했습니다.

이력 조회와 분석

기간별 측정값과 이벤트를 조회하고 그래프·통계·CSV 내보내기로 살펴볼 수 있게 구성했습니다.

내가 맡은 역할

활선안전경보기 모니터링 프로그램 개발 프로젝트입니다. BLE 수집, 로컬 DB 저장, 상태 표시와 이력·그래프·통계 기능을 구성했습니다.

DB 설계 담당

측정 이력·패널 상태·이벤트·설정 테이블과 시간·패널별 조회 구조 설계

Python 프로그램과 Vite 디자인 버전의 코드를 함께 검토했습니다. 첨부 화면은 Vite 앱의 데모 데이터이며 실제 BLE 측정 화면이 아닙니다. 원본 Python DB나 장치 스캔은 실행하지 않았습니다.

02 / SOLUTION & IMPLEMENTATION

해결/구현 — 어떻게 만들었는가

전체 아키텍처

BLE 장치의 광고 데이터를 Bleak 콜백이 수신하고 파싱해 asyncio 큐에 전달합니다. DB 쓰기 태스크가 측정값과 패널 상태를 SQLite에 저장하고 타임아웃 태스크가 수신 중단을 처리합니다. 별도 PyQt5 UI 프로세스가 QTimer로 DB를 조회해 요약·상세 화면을 갱신하며 Matplotlib 그래프와 NumPy 통계, CSV 내보내기를 제공합니다.
BLE 수집 · SQLite 저장 · 데스크톱 표시

실제 코드에서 확인한 프로세스와 태스크 구분입니다. 측정 정확도나 안전 효과를 입증하는 성능 측정치는 포함하지 않습니다.

크게 보기 ↗
이미지의 텍스트 설명

BLE 장치의 광고 데이터를 Bleak 콜백이 수신하고 파싱해 asyncio 큐에 전달합니다. DB 쓰기 태스크가 측정값과 패널 상태를 SQLite에 저장하고 타임아웃 태스크가 수신 중단을 처리합니다. 별도 PyQt5 UI 프로세스가 QTimer로 DB를 조회해 요약·상세 화면을 갱신하며 Matplotlib 그래프와 NumPy 통계, CSV 내보내기를 제공합니다.

Vite 디자인 개편 화면

React·TypeScript로 상황판 카드, 상세 표, 기준 설정과 상태 시나리오 제어를 구성했습니다. 현재 버전은 메모리의 데모 데이터를 사용하며 실제 BLE·DB 연결과 구분됩니다.

BLE 스캐너 · Bleak / asyncio

광고 수신 콜백에서 장치 데이터를 파싱하고 큐에 넣습니다. DB 쓰기 태스크와 수신 타임아웃 태스크를 분리해 실행합니다.

SQLite 데이터 모델

PanelData에 측정 이력, PanelStatus에 최근 수신과 연결 상태, event_log에 이벤트를 저장합니다. 설정과 조회 SQL은 데이터 모델과 쿼리 모듈에서 관리합니다.

PyQt5 모니터링 화면

QTimer로 설정된 주기에 데이터를 읽어 요약·상세 화면을 갱신합니다. 설정, 그래프, 이벤트 로그, 데이터 다운로드 대화상자를 제공합니다.

기술 선택 이유

Vite · React · TypeScript

디자인 개편 화면을 브라우저에서 실행하고 컴포넌트·패널 데이터 타입과 상태를 구성합니다. 기존 Python 프로그램의 측정 흐름을 실제로 연결한 웹 서버 구현이라는 의미는 아닙니다.

Python · PyQt5

장치 데이터 처리와 데스크톱 인터페이스를 Python으로 구성하고 PyQt5 위젯·타이머·백그라운드 다운로드 스레드를 사용했습니다.

Bleak · asyncio · multiprocessing

BLE 수신은 Bleak으로, 수집·저장·타임아웃 분리는 asyncio로 구성했습니다. UI와 스캐너는 multiprocessing으로 별도 프로세스에서 실행합니다.

SQLite · Matplotlib · NumPy

로컬 측정값과 이벤트는 SQL 테이블에 저장하고 그래프와 패널별 통계 계산에 Matplotlib·NumPy를 사용합니다.

DB · API · 인프라 구조

로컬 관계형 DB

SQLite의 PanelData·PanelStatus·event_log와 설정 테이블을 사용합니다. 스캐너는 주 DB와 백업 DB 경로에 저장하도록 구성하며 WAL 모드와 잠금 재시도 코드를 사용합니다. 자동 장애 복구를 검증했다는 의미는 아닙니다.

BLE 데이터 형식

기존 19바이트와 부분방전 정보가 포함된 21바이트 패킷을 처리합니다. struct로 값을 읽고 전압·온도·습도 등 표시용 값으로 변환합니다.

UI 조회와 내보내기

최신값과 기간별 측정 이력을 DB에서 조회합니다. CSV 다운로드는 Qt 스레드로 처리하고 이벤트 이력도 별도로 내보낼 수 있습니다.

핵심 처리 흐름

  1. 01. BLE 광고 수신과 파싱

    장치를 구분하고 허용된 패킷 길이의 데이터를 파싱해 패널 번호·수신 시각·측정값을 큐에 전달합니다.

  2. 02. 측정 이력과 온라인 상태 저장

    DB 쓰기 태스크가 큐 데이터를 가져와 측정 이력과 최근 수신 정보를 기록합니다. SQLite 잠금은 재시도 경로로 처리합니다.

  3. 03. 수신 중단 확인

    타임아웃 태스크가 최근 수신 시각을 확인해 패널의 오프라인 상태와 이벤트 이력을 갱신합니다.

  4. 04. 화면 갱신과 이력 분석

    UI 프로세스가 최신 데이터를 조회해 상태를 표시하고 선택한 기간의 그래프·통계·CSV 자료를 제공합니다.

가장 어려웠던 문제와 해결

DB 처리와 BLE 수신의 결합 줄이기

문제
순차 구조에서는 DB 처리 지연이 다음 스캔 시작을 늦출 수 있었습니다.
해결 방법
BLE 콜백 → asyncio 큐 → DB 쓰기 태스크로 연결하고 타임아웃 확인을 별도 태스크로 구성했습니다.
검증 결과
코드에서 수집·저장·타임아웃 처리를 분리한 구조를 확인했습니다. 패킷 누락률이나 처리 지연의 개선 수치는 측정 자료가 없어 제시하지 않습니다.

기존 장치 데이터와 부분방전 정보 호환

문제
기존 패킷과 부분방전 항목이 추가된 패킷을 함께 처리할 필요가 있었습니다.
해결 방법
19/21바이트 데이터를 구분해 파싱하고 부분방전 필드가 없는 기존 형식은 기본값으로 처리합니다. 기존 DB에 컬럼이 없으면 스키마를 보완하는 코드가 있습니다.
검증 결과
이전 데이터 형식과 확장 형식을 처리하는 경로를 구성했습니다. 실제 장치 연결 시험은 이번 확인에서 실행하지 않았습니다.

내가 직접 구현한 것

장치 수집과 저장 구조

BLE 광고 파싱, 큐 기반 비동기 저장, 패널 통신 상태와 이벤트 기록을 구성했습니다.

모니터링 UI

요약·상세 화면과 설정, 그래프, 로그·데이터 내보내기 흐름을 구현했습니다.

측정 이력 분석

NumPy로 평균·표준편차와 전압 간 상관관계, 부분방전 발생 데이터를 계산하는 기능을 구성했습니다.

03 / RESULTS & VALIDATION

결과/검증 — 그래서 무엇이 좋아졌는가

디자인 버전 실행과 화면 확인

Vite 앱을 실행해 상황판·상세정보·기준설정 화면을 확인하고 과열 시나리오 적용 화면을 캡처했습니다. 화면 데이터는 실측값이 아니라 프로토타입 데모 데이터입니다.

패널 데이터를 한 화면에서 확인

측정값과 통신 상태를 요약·상세 화면에서 조회하고 이력을 그래프·통계로 살펴보는 데스크톱 프로그램을 구현했습니다.

수집과 운영 데이터 처리 분리

수집 큐와 저장·타임아웃 태스크, 별도 UI 프로세스를 구성했습니다. 현장 적용 여부와 안전 효과, 성능 개선 수치는 추가 확인이 필요합니다.

검증 방법과 근거

README와 BLE 스캐너·데이터 모델·UI·통계 모듈을 검토했습니다. 원본 DB의 측정값을 공개하거나 장치 스캔·DB 초기화·모니터링 프로그램 실행을 수행하지 않았습니다. Vite 디자인 버전은 임시 복사본에서 실행해 상황판·상세정보·기준설정과 과열 시나리오 화면을 캡처했습니다. Python 프로그램의 실제 장치 연결과 현장 검증 자료는 포함하지 않았습니다.

실행 화면

10개 배전반의 정상 상태를 카드로 표시한 Vite 상황판
디자인 개편 · 상황판

Vite · React · TypeScript 앱 직접 실행 캡처 · 데모 데이터

배전반별 전압·온도·습도·도어와 결과를 표로 표시한 상세정보 화면
디자인 개편 · 상세정보

상세 데이터 표 · 데모 데이터

감시 기준 값을 설정하는 Vite 디자인 버전 화면
디자인 개편 · 기준설정

프로토타입의 기준 설정 화면 · 실제 장치 설정 변경 화면이 아닙니다.

과열 시나리오를 적용해 경보 상태를 표시한 상황판
디자인 개편 · 과열 시나리오

시나리오 제어로 생성한 시뮬레이션 화면 · 실제 경보 발생 기록이 아닙니다.