센서1·3(누수 노드)에 PMS7003 를 온습도와 동일 sensor_id 로 통합하고 metric_type='pms7003'
로 구분해 수집한다. LED 는 스위칭 없이 상시 점등 방식으로 확정.
- raspberry_pi4_pms7003/: PMS7003 노드 풀세트(드라이버·센서·install·systemd·vendor·배선·연결테스트·프레임 단위테스트)
- 서버: evaluate_metric_thresholds() 에 pm25/pm10 선택 인자 추가(온습도 전용 호출 후방호환),
sensor_data.php 수집 경로에 pms7003 metric 반영, config.php/예시에 PM 임계 추가
- SQL: migration_pms7003.sql · schema_sht30.sql 정합, tools/migration_leak_add_{pms7003,sht30} 마이그레이터
- tests/pm_threshold_test.php + run_tests.sh 러너 등록
- .gitignore: 노드별 config_local.py 커밋 차단
117 lines
5.7 KiB
Markdown
117 lines
5.7 KiB
Markdown
# 07 — 기존 누수 노드에 미세먼지(PMS7003) 추가 마이그레이션 (USB 원샷)
|
|
|
|
이미 **설치·하드닝 완료**된 누수 노드(Pi-A id=1, Pi-C id=3)를
|
|
**누수+미세먼지 결합 노드**로 전환하는 현장 마이그레이션 패키지.
|
|
온습도(SHT30) 마이그레이션(05번)과 동일한 방식 — 기존 누수·온습도 서비스·하드닝은
|
|
건드리지 않고 PMS7003 미세먼지 서비스만 얹는다. **하나의 USB 로 두 노드 모두 사용 가능**
|
|
(sensor_id·위치·API 키를 기존 설정에서 자동 추출).
|
|
|
|
> 미세먼지는 **연기(화재)의 대리 지표**로도 쓰인다 — 연기 입자가 유입되면 PM 농도가 급등한다.
|
|
> (구 연기감지 개조 계획은 폐기되고 PMS7003 metric 통합으로 대체됨 — 설계문서 참조.)
|
|
|
|
## 전제
|
|
|
|
- 노드: Raspberry Pi 4, Raspberry Pi OS Bookworm, harden_pi.sh 적용 완료
|
|
(SSH 꺼짐 → 현장 모니터+키보드 작업, USB 반입)
|
|
- 누수 서비스(leak-sensor) 정상 동작 중, `config_local.py` 존재
|
|
- 하드웨어: PMS7003 을 UART 로 배선
|
|
- VCC → 5V(물리 pin2), GND → GND(물리 pin6)
|
|
- PMS7003 TXD → Pi RXD(GPIO15, 물리 pin10) ※ Pi TXD 는 PMS 로 보낼 필요 없음(읽기 전용)
|
|
- (배선도: `deploy/02_pi_a_leak_id1/WIRING.html` 및 노드 통합 설계문서 참고)
|
|
- **온습도(SHT30)와 UART/I2C 는 서로 다른 버스라 병행 무충돌** — 같은 노드에 온습도+미세먼지 공존 가능.
|
|
|
|
## 1. 빌드 PC에서 USB 준비 (인터넷 필요, 1회)
|
|
|
|
```bash
|
|
cd deploy/07_migration_leak_add_pms7003/pms7003
|
|
bash vendor.sh # debs/ + wheelhouse/ 오프라인 번들 생성
|
|
```
|
|
|
|
`07_migration_leak_add_pms7003/` 폴더 **통째로** USB 에 복사.
|
|
번들 포함 확인: `pms7003/debs/*.deb`, `pms7003/wheelhouse/` 가 있어야
|
|
현장에서 네트워크 없이 설치된다(없으면 migrate.sh 가 경고 후 확인을 요구).
|
|
|
|
## 2. 현장 노드에서 실행 — 콘솔 전용 절차 (한 번에)
|
|
|
|
하드닝된 노드는 GUI·SSH 가 없다. 모니터+키보드 콘솔에서 아래 순서 그대로.
|
|
USB 는 **FAT32 포맷 권장** (exFAT/NTFS 드라이버는 노드에 없을 수 있음).
|
|
|
|
```bash
|
|
# ① 콘솔 로그인: 사용자 pi (하드닝 후에도 로컬 콘솔 로그인은 살아 있음)
|
|
|
|
# ② USB 꽂고 장치 이름 확인 — 콘솔은 자동 마운트가 없다
|
|
lsblk -f
|
|
# 보통 sda1 로 보임 (SIZE·FSTYPE=vfat 으로 USB 인지 확인. SD 루트는 mmcblk0)
|
|
|
|
# ③ 수동 마운트
|
|
sudo mkdir -p /mnt/usb
|
|
sudo mount /dev/sda1 /mnt/usb # ②에서 확인한 장치명으로
|
|
|
|
# ④ 마이그레이션 실행 (USB에서 직접 실행 — noexec 이어도 bash 호출이라 무관)
|
|
cd /mnt/usb/07_migration_leak_add_pms7003
|
|
sudo bash migrate.sh
|
|
|
|
# ⑤ 스크립트가 끝에 안내하는 내용 확인:
|
|
# - "마이그레이션 완료" + 서비스 실행 중 → ⑥으로
|
|
# - "재부팅 하세요" (UART 첫 활성화) → ⑥ 후 sudo reboot
|
|
|
|
# ⑥ USB 분리
|
|
cd /
|
|
sudo umount /mnt/usb # 뽑기 전 반드시 umount
|
|
```
|
|
|
|
재부팅한 경우 부팅 후 자동 시작 확인:
|
|
|
|
```bash
|
|
systemctl status pms7003-sensor # active (running) 이면 완료
|
|
journalctl -u pms7003-sensor -n 20 # 10분 주기 보고 로그 확인
|
|
```
|
|
|
|
문제 시(서비스 fail 등) SSH 가 없으므로 같은 콘솔에서
|
|
`journalctl -u pms7003-sensor -e` 로 원인 확인 — 롤백 절차는 아래 참고.
|
|
|
|
migrate.sh 가 자동으로:
|
|
|
|
1. 기존 누수 설치 경로 탐지(leak-sensor.service → `/home/pi/raspberry_pi4` 폴백)
|
|
2. 기존 `config_local.py` 에서 API_URL·API_KEY·위치·sensor_id 추출
|
|
→ `/home/pi/pms7003/config_local.py` 자동 생성(**동일 sensor_id**, 10분 주기, 600 권한)
|
|
3. 오프라인 설치(UART 활성화: `enable_uart=1` + 직렬콘솔 분리, venv, pyserial 등) — `pms7003/install.sh` 재사용
|
|
4. systemd `pms7003-sensor` 등록·기동(샌드박스 유닛 그대로)
|
|
5. UART 장치(`/dev/serial0`)·서비스 상태 검증
|
|
|
|
UART 를 처음 켠 노드는 마지막에 **재부팅 안내**가 나온다 → `sudo reboot`
|
|
(서비스는 부팅 시 자동 시작).
|
|
|
|
## 3. 확인
|
|
|
|
- 노드: `systemctl status pms7003-sensor`, `journalctl -u pms7003-sensor -n 20`
|
|
- 서버 대시보드(실시간 현황): 해당 번호 센서 카드에 **누수·(온습도)·미세먼지 칩이 함께** 표시되고
|
|
PM1.0/PM2.5/PM10 수치·24h 스파크라인이 보이면 정상
|
|
- 서버 `config.local.php`: `'METRIC_SENSOR_IDS' => [1, 2, 3]` 에 해당 id 포함 확인
|
|
- PM 임계 초과 시 `[미세먼지경보]` SMS 발송(수신자는 기존 sensor_id 그룹 그대로)
|
|
|
|
## 롤백
|
|
|
|
```bash
|
|
sudo systemctl disable --now pms7003-sensor
|
|
sudo rm /etc/systemd/system/pms7003-sensor.service && sudo systemctl daemon-reload
|
|
sudo rm -rf /home/pi/pms7003
|
|
```
|
|
|
|
누수·온습도 서비스는 처음부터 독립이므로 영향 없다.
|
|
(UART 를 다시 콘솔로 되돌리려면 `sudo raspi-config` → Interface → Serial 에서 로그인 셸 ON.)
|
|
|
|
## 폴더 구성
|
|
|
|
```
|
|
07_migration_leak_add_pms7003/
|
|
├── README.md 이 문서
|
|
├── migrate.sh 원샷 마이그레이션 스크립트 (sudo bash migrate.sh)
|
|
└── pms7003/ PMS7003 서비스 페이로드 (raspberry_pi4_pms7003 소스와 동일)
|
|
├── install.sh UART 활성화·venv·오프라인 패키지 설치 (migrate.sh 가 호출)
|
|
├── vendor.sh 빌드 PC용 오프라인 번들 생성 → debs/ wheelhouse/
|
|
├── config_local.example.py 참고용 — 실파일은 migrate.sh 가 자동 생성
|
|
├── pms7003_sensor.py / pms7003_driver.py
|
|
├── test_sensor.py / test_connection.py
|
|
└── systemd/pms7003-sensor.service (경로는 migrate.sh 가 치환)
|
|
```
|