공장 통합 모니터링 시스템 Monitory의 시나리오 기반 센서 데이터 시뮬레이션을 위한 레포지토리입니다.
Monitory Scenario Simulator는 공장 내 이상 상황을 시나리오 기반으로 시뮬레이션하는 시스템입니다.
CSV 파일로 정의된 시나리오 데이터를 통해 정상→이상→정상 상태 전환을 재현하며, AWS IoT Core를 통해 MQTT 프로토콜로 센서 데이터를 전송합니다.
- 시나리오 기반 시뮬레이션: CSV 파일로 정의된 정상/이상 시나리오 데이터 재생
- 상태 전환 시뮬레이션: 정상→이상, 이상→정상 전환 과정 시뮬레이션
- 실시간 데이터 전송: AWS IoT Core를 통한 MQTT 기반 데이터 송신
- 공정별 시나리오: 중합공정, 탈휘공정 등 다양한 공정 시나리오 지원
- 웹 기반 제어: Streamlit을 통한 직관적인 시나리오 제어 인터페이스
- 멀티 센서 동기화: 여러 센서의 동시 상태 전환 및 데이터 전송
monitory-scenario-simulator/
├── service/
│ ├── ZoneScenario.py # Zone 센서 시나리오 관리
│ ├── EquipScenario.py # Equipment 센서 시나리오 관리
│ └── CsvScenarioInterface.py # 시나리오 인터페이스
├── mqtt/
│ └── publish.py # AWS IoT Core MQTT 연결
├── data/
│ ├── scenario1_중합공정/ # 중합공정 시나리오 데이터
│ │ ├── 공간/ # Zone 센서 데이터
│ │ │ ├── 온도센서/
│ │ │ └── voc센서/
│ │ └── 설비/ # Equipment 센서 데이터
│ │ ├── 온도센서/
│ │ ├── 습도센서/
│ │ ├── 압력센서/
│ │ ├── 진동센서/
│ │ ├── active/
│ │ └── reactive/
│ └── scenario2_탈휘공정/ # 탈휘공정 시나리오 데이터
│ ├── 공간/
│ │ ├── 온도센서/
│ │ ├── voc센서/
│ │ ├── 습도센서/
│ │ └── 먼지센서/
│ └── 설비/
│ ├── 온도센서/
│ ├── 습도센서/
│ ├── 압력센서/
│ ├── 진동센서/
│ ├── active/
│ └── reactive/
├── config/
│ ├── scenario_configs.py # 시나리오 설정 파일
│ └── ui_components.py # UI 컴포넌트
├── utils.py # 유틸리티 함수
├── app_main.py # Streamlit 메인 앱 (최신)
├── app.py # 레거시 앱
└── app2.py # 확장 앱
- CSV 파일 기반: 시간순으로 정렬된 센서 데이터 시나리오
- 상태별 데이터: 정상, 정상→이상, 이상, 이상→정상 4가지 상태
- 루프 재생: 안정 상태(정상/이상) 데이터의 순환 재생
- 전환 데이터: 상태 변경 시 일회성 전환 데이터 재생
- 중합공정(Polymerization): 고온/고압 화학반응 시나리오
- Zone 센서: 온도, VOC
- Equipment 센서: 온도, 습도, 압력, 진동, 유효전류, 무효전류
- 탈휘공정(Devolatilization): 고온 휘발성 제거 시나리오
- Zone 센서: 온도, VOC, 습도, 먼지
- Equipment 센서: 온도, 습도, 압력, 진동, 유효전류, 무효전류
- 동기화된 상태 변경: 모든 센서의 동시 상태 전환
- 비동기 처리: asyncio 기반 멀티 센서 비동기 실행
- 전환 보호: 전환 중 중복 상태 변경 방지 메커니즘
- 안전한 중지: 모든 센서의 안전한 종료 처리
- 탭 기반 UI: 공정별 독립적인 제어 인터페이스
- 실시간 모니터링: 각 센서별 현재 상태 및 값 표시
- 버튼 제어: 시나리오 실행, 정상→이상, 이상→정상, 중지
- 상태 표시: Zone 센서와 Equipment 센서 구분 표시
- Python 3.13+
- AWS IoT Core, MQTT
- Streamlit (웹 인터페이스)
- Asyncio (비동기 처리)
- Threading (백그라운드 실행)
- Pandas (CSV 데이터 처리)
- 센서 시뮬레이터 사이트 url - http://43.202.63.21:8501/
- 시나리오 시뮬레이터 사이트 url - http://43.202.63.21:8502/
- Zone 센서 (ZoneId == EquipId)
sensor/zone/ZONE-001/ZONE-001/UA10T-TEM-24060890/temp
sensor/zone/ZONE-001/ZONE-001/UA10V-VOC-24060891/voc
- Equipment 센서 (ZoneId != EquipId)
sensor/equip/ZONE-001/EQUIP-001/UA10T-TEM-24060890/temp
sensor/equip/ZONE-001/EQUIP-001/UA10H-HUM-24060891/humidity
sensor/equip/ZONE-001/EQUIP-001/UA10P-PRS-24060892/pressure
sensor/equip/ZONE-001/EQUIP-001/UA10V-VIB-24060893/vibration
sensor/equip/ZONE-001/EQUIP-001/UA10A-ACT-24060894/active
sensor/equip/ZONE-001/EQUIP-001/UA10R-REA-24060895/reactive
- Shadow 등록 토픽
$aws/things/Sensor/shadow/name/{sensorId}/update
- 기본 센서 데이터
{
"zoneId": "ZONE-001",
"equipId": "EQUIP-001",
"sensorId": "UA10T-TEM-24060890",
"sensorType": "temp",
"val": 85.2
}- Shadow 등록 데이터
{
"state": {
"reported": {
"sensorId": "UA10T-TEM-24060890",
"zoneId": "ZONE-001",
"equipId": "EQUIP-001",
"type": "temp",
"status": "ON"
}
}
}시나리오 CSV 파일은 다음 컬럼을 포함해야 합니다:
zoneId,equipId,sensorId,sensorType,val
ZONE-001,EQUIP-001,UA10T-TEM-24060890,temp,25.4
ZONE-001,EQUIP-001,UA10T-TEM-24060890,temp,26.1
...
파일 명명 규칙:
{공정명}_{센서타입}_정상.csv: 정상 상태 데이터{공정명}_{센서타입}_정상_이상.csv: 정상→이상 전환 데이터{공정명}_{센서타입}_이상.csv: 이상 상태 데이터{공정명}_{센서타입}_이상_정상.csv: 이상→정상 전환 데이터
- 시나리오 실행: 모든 센서가 정상 상태 데이터 루프 재생 시작
- 정상→이상: 전환 데이터 재생 후 이상 상태 데이터 루프로 변경
- 이상→정상: 전환 데이터 재생 후 정상 상태 데이터 루프로 복귀
- 중지: 모든 센서 안전 종료 및 상태 초기화
- CSV 파일 경로: 데이터 파일이 올바른 경로에 위치해야 함
- 전환 중 보호: 전환 진행 중 중복 상태 변경 시도 시 무시됨
- AWS 비용: 대량 시나리오 실행 시 AWS IoT Core 요금 발생 가능
- 메모리 관리: 장시간 실행 시 메모리 사용량 모니터링 필요
- 브라우저 리소스: Streamlit 자동 새로고침으로 인한 브라우저 부하 주의
| 공정 타입 | 설명 | Zone 센서 | Equipment 센서 |
|---|---|---|---|
| 중합공정 | 단량체 결합 고분자 생성 | 온도, VOC | 온도, 습도, 압력, 진동, 유효전류, 무효전류 |
| 탈휘공정 | 고온 휘발성 성분 제거 | 온도, VOC, 습도, 먼지 | 온도, 습도, 압력, 진동, 유효전류, 무효전류 |
scenario_configs.py에서 시나리오 설정을 관리:
polymerization_config = {
"mqtt_connections": {
"zone_temp_conn": "zone_temp",
"equip_temp_conn": "temp",
# ...
},
"scenarios": {
"s1_zone_temp": {
"normal": "./data/scenario1/zone/temp_sensor/normal.csv",
"normal_to_warn": "./data/scenario1/zone/temp_sensor/normal_warn.csv",
"warn": "./data/scenario1/zone/temp_sensor/warn.csv",
"warn_to_normal": "./data/scenario1/zone/temp_sensor/warn_normal.csv",
"type": "ZoneScenario",
"conn_ref_key": "zone_temp_conn"
},
# ...
}
}