$s) { $sensor_cards[(int)$sid] = ['type' => 'metric', 's' => $s]; } foreach ($leak_statuses as $sid => $s) { if (!isset($sensor_cards[(int)$sid])) { $sensor_cards[(int)$sid] = ['type' => 'leak', 's' => $s]; } } ksort($sensor_cards); ?>
실시간 상태 Live

센서 현황 · 개소

$card): $type = $card['type']; $s = $card['s']; $type_label = $type === 'metric' ? '온습도' : '누수'; // 미수신 placeholder if ($s === null): ?>
번 센서
데이터 없음
아직 수신된 데이터가 없습니다.
(온습도 경보 | 누수) > 정상 if ($type === 'metric') { $status_code = $s['metric_status'] ?? 'normal'; if ($s['is_offline']) { $card_class = 'offline'; $badge_class = 'offline'; $badge_text = $s['is_alerting'] ? ('오프라인 (' . metric_status_label($status_code) . ' 중 끊김)') : '오프라인'; } elseif ($s['is_alerting']) { $card_class = 'alert'; $badge_class = 'alert'; $badge_text = metric_status_label($status_code) . ' 경보!'; } else { $card_class = ''; $badge_class = 'ok'; $badge_text = '정상'; } } else { $is_leaking = (int)($s['is_leak'] ?? 0) === 1; if ($s['is_offline']) { $card_class = 'offline'; $badge_class = 'offline'; $badge_text = $is_leaking ? '오프라인 (누수 중 끊김)' : '오프라인'; } elseif ($is_leaking) { $card_class = 'leak'; $badge_class = 'leak'; $badge_text = '누수'; } else { $card_class = ''; $badge_class = 'ok'; $badge_text = '정상'; } } ?>
/
온도 습도
측정:
측정값 없음
최종확인: (분 전)
near>safe) if ($type === 'metric'): $fc = (!$s['is_offline'] && isset($forecasts[$sid])) ? $forecasts[$sid] : null; if ($fc): $chips = []; foreach ($fc['headroom'] as $h) { $chips[] = ['state' => $h['state'], 'text' => $h['label'] . ' 여유 ' . $h['margin'] . $h['unit']]; } foreach (['temp', 'hum'] as $vk) { $e = $fc['trend'][$vk]['eta'] ?? null; if ($e) { $chips[] = ['state' => 'near', 'text' => '↗ ~' . (int)$e['min'] . '분 뒤 ' . metric_status_label($e['key'])]; } } foreach ($fc['rate'] as $r) { $chips[] = ['state' => 'near', 'text' => ($r['spike'] === 'rise' ? '급상승 ' : '급락 ') . ($r['per10'] > 0 ? '+' : '') . $r['per10'] . '/10분']; } if (!empty($fc['dew']['risk'])) { $chips[] = ['state' => 'near', 'text' => '결로주의 (마진 ' . $fc['dew']['margin'] . '℃)']; } $chip_rank = ['over' => 0, 'near' => 1, 'safe' => 2]; usort($chips, fn($a, $b) => ($chip_rank[$a['state']] ?? 3) <=> ($chip_rank[$b['state']] ?? 3)); ?>
예보: 임계 여유 충분

아직 수신된 센서 데이터가 없습니다.

미복구 누수 사고 · 건

#센서위치감지 시각상태
미복구

사진·복구 시각 등 전체 사고 이력은 이력 조회 탭에서 확인하세요.

채널·오늘 요약

SMS 채널 상태

잔여 건수
마지막 성공 발송
오늘 발송 / 실패
건 / 건

SMS는 유일한 경보 채널입니다. 잔여 건수가 건 이하면 충전하세요.

오늘 경보 요약

오늘 경보 횟수
건
오늘 최근 경보
가동률
% (/ 온라인)

7일·30일 추이는 추이·통계 탭에서 확인하세요.