Helana Log
How Helena Lives · Docs

보고 무전기 — 이상을 어떻게 알리는가 (텔레그램)

앞선 편들이 감시(배터리·온도·위치)와 통로(원격망)를 다뤘다면, 이 편은 **그 숫자들을 사람에게 전달하는 마지막 단계**다. 데몬이 아무리 잘 감지해도, 아무에게도 안 들리면 무의미하다. 보고 무전기는 텔레그램이다.

source · docs/care-daemon/solution/10-report-radio.md · bridge docs↔web · _Grok

id: “10”
type: solution
title: “보고 무전기 — 이상을 어떻게 알리는가 (텔레그램)”
question: “감지한 이상을 어떻게 보고하는가”
answer: “send_alert가 등급(urgent/warning/info)별 아이콘과 함께 텔레그램으로 즉시 발송하고, 긴급 시 2차 수신자에게 에스컬레이션하며, 매시 정각 근처에 정기 보고를 남긴다”
category: “보고 무전기”
category_id: 1307312
track: “”
sources:
- helena_phone:care/care-daemon.sh
- helena_phone:care/care.conf
interactive:
- report-flow
- report-levels
date: “2026-08-16”
민감정보: “없음”


보고 무전기 — 이상을 어떻게 알리는가 (텔레그램)

앞선 편들이 감시(배터리·온도·위치)와 통로(원격망)를 다뤘다면, 이 편은 그 숫자들을 사람에게 전달하는 마지막 단계다. 데몬이 아무리 잘 감지해도, 아무에게도 안 들리면 무의미하다. 보고 무전기는 텔레그램이다.

1. 질문

감지한 이상을 어떻게 보고하는가.

한 줄로: 감지 단계가 만든 등급(level) 을 받아, send_alert가 텔레그램으로 즉시 발송하고, 긴급이면 2차 수신자에게 에스컬레이션하며, 이상이 없어도 매시 정각 근처에 정기 보고를 남긴다.

2. 원리

보고는 등급 주도로 흐른다. 분석 단계(편 07·08)가 levelinfowarningurgent로 올려두면, 보고 단계가 그 등급대로 행동한다.

보고의 신뢰성은 “안 오면 죽은 것” 이라는 역발상에 있다. 정기 보고를 주기적으로 남기므로, 그게 끊기면 데몬·네트워크 어딘가가 죽었다는 뜻이다(편 09의 워치독 설계와 연결).

3. 실물 (코드·설정)

send_alert가 등급별 아이콘을 붙이고 텔레그램 API로 발송한다.

send_alert() {
  local level="$1" msg="$2" target="${3:-$TG_CHAT_HELENA}"
  local icon
  case "$level" in
    urgent)  icon="🔴" ;;
    warning) icon="🟡" ;;
    info)    icon="🟢" ;;
    *)       icon="📢" ;;
  esac
  curl -s -X POST "https://api.telegram.org/bot${TG_TOKEN}/sendMessage" \
    -d "chat_id=${target}" \
    -d "text=${text}" \
    -d "disable_notification=${DISABLE_NOTIFY:-false}" >/dev/null 2>&1
}

보고는 등급에 따라 갈린다(즉시 + 에스컬레이션 + 정기).

if [ "$ALERT_LEVEL" = "urgent" ] || [ "$ALERT_LEVEL" = "warning" ]; then
  send_alert "$ALERT_LEVEL" "$report" "$TG_CHAT_HELENA"
  # 긴급 시 2차 수신자에게도
  if [ "$ALERT_LEVEL" = "urgent" ] && [ -n "${TG_CHAT_PASTOR:-}" ]; then
    send_alert "urgent" "[에스컬레이션] $report" "$TG_CHAT_PASTOR"
  fi
fi
# 정기 보고 (매시 정각 ±5분)
if [ "$min" -le 5 ]; then send_alert "info" "$report" "$TG_CHAT_HELENA"; fi

```care type=”flow” id=”report-flow”
title: 보고 흐름 — 등급 → 즉시 발송 → 에스컬레이션 / 정기
nodes:
- { id: level, label: “분석 결과 (level)”, kind: start }
- { id: send, label: “즉시 발송 (헬레나)” }
- { id: esc, label: “에스컬레이션 (목사님)” }
- { id: regular, label: “정기 보고 (매시)” }
edges:
- { from: level, to: send, label: “urgent/warning 시” }
- { from: send, to: esc, label: “urgent면” }
- { from: esc, to: regular }


## 4. 등급 (임계값 아님 — 보고 등급)

보고는 임계값이 아니라 **등급 3단계**로 움직인다. 아이콘·수신처가 등급에 따라 달라진다.

```care type="threshold-table" id="report-levels"
title: 보고 등급 3단계 (send_alert)
rows:
  - { label: "urgent 🔴", threshold: "방전·급감·무변동", action: "즉시 + 2차 수신자 에스컬레이션", level: urgent }
  - { label: "warning 🟡", threshold: "과열·GPS 무응답·WiFi 약함", action: "즉시 발송 (1차만)", level: warning }
  - { label: "info 🟢", threshold: "이상 없음 (매시 정각)", action: "정기 보고 (하트비트)", level: info }

5. 한계·확인 창구

이 채널은 법률 자문도 의료 가이드도 아니다.