10. Alarm サービス
client.alarm() でアクセスします。アラームイベントの単件取得/最近の一覧取得の2機能を提供します。詳細な統計やアラーム設定(Config)のCRUDが必要な場合は、データゲートウェイを直接利用してください。
9.1 メソッド一覧
| メソッド | 戻り値の型 | HTTP | エンドポイント |
|---|---|---|---|
get(alarm_seq) | AlarmResponseV5 または null | GET | /api/v5/alarm/{seq} |
list(limit) | List<AlarmResponseV5> | GET | /api/v5/alarm?limit=... |
limit ≤ 1000を推奨します。より多くのデータが必要な場合は、データゲートウェイで直接照会することをおすすめします。
9.2 AlarmResponseV5 DTO
アラーム本体 + 位置情報(tag/opc/site)のJOIN結果を併せて含みます。
アラーム本体フィールド
| フィールド | 型 | 説明 |
|---|---|---|
alarm_seq | long | アラームシーケンス (PK) |
alarm_config_id | String | アラーム設定ID |
priority | String | 優先度 (HI_HI, HI, LO, LO_LO, TRIP) |
description | String | アラームメッセージ |
is_on | String | 現在の有効状態 (Y/N) |
is_read | String | 既読状態 (Y/N) |
on_timestamp | long | 発生時刻(ミリ秒) |
off_timestamp | long | 解除時刻(0 = 未解除) |
on_duration | long | 継続時間(ミリ秒) |
位置JOINフィールド(list レスポンスに含まれる)
| フィールド | 説明 |
|---|---|
tag_id, tag_name, tag_description | タグ情報 |
opc_id, opc_name | OPC情報 |
site_id, site_name | サイト情報 |
tag_location | 資産パス文字列 (SITE > AREA > LINE > EQUIPMENT) |
単件の
get()レスポンスは mm_alarm 本体のみが設定され、JOINフィールドはnullとなる場合が多くあります。UI表示用であればlist()の結果を使用することを推奨します。
9.3 アラーム優先度
| コード | 意味 | 一般的な色 |
|---|---|---|
HI_HI | 危険 (Critical) | 赤 |
HI | 注意 (Warning) | オレンジ |
LO | 情報 (Info) | 黄 |
LO_LO | 回復 (Recovery) | 青 |
TRIP | トリップ(強制停止) | 黒 |
9.4 使用例
最近のアラーム一覧
import java.util.List;
import plantpulse.api.v5.dto.response.AlarmResponseV5;
List<AlarmResponseV5> alarms = client.alarm().list(50);
for (AlarmResponseV5 a : alarms) {
System.out.printf("[%s] %s - %s (%s)%n",
a.getPriority(),
a.getSite_name(),
a.getDescription(),
a.getTag_location());
}
出力例:
[HI_HI] 대전공장 - Spindle 온도 임계치 초과 (SITE_DJ > A_0001 > L_0001 > CNC #1)
[HI] 대전공장 - 압력 상한 (SITE_DJ > A_0001 > L_0001 > Press #2)
単件取得
AlarmResponseV5 alarm = client.alarm().get(12345L);
if (alarm != null) {
System.out.println("발생 시각: " + alarm.getOn_timestamp());
System.out.println("우선순위: " + alarm.getPriority());
System.out.println("지속 시간: " + alarm.getOn_duration() + " ms");
}
有効なアラームのみフィルタリング(クライアント側)
V5はサーバー側の有効フィルタに対応していないため、クライアント側で処理します。
import java.util.stream.Collectors;
List<AlarmResponseV5> active = client.alarm().list(500).stream()
.filter(a -> "Y".equals(a.getIs_on()))
.collect(Collectors.toList());
System.out.println("현재 활성 알람: " + active.size() + "건");
サイト別グループ化
import java.util.Map;
import java.util.stream.Collectors;
Map<String, Long> bySite = client.alarm().list(1000).stream()
.filter(a -> "Y".equals(a.getIs_on()))
.collect(Collectors.groupingBy(
AlarmResponseV5::getSite_id,
Collectors.counting()));
bySite.forEach((siteId, count) ->
System.out.printf("%s: %d건%n", siteId, count));
優先度別カウント
Map<String, Long> byPriority = client.alarm().list(1000).stream()
.collect(Collectors.groupingBy(
AlarmResponseV5::getPriority,
Collectors.counting()));
9.5 活用シナリオ
シナリオ — リアルタイムアラームダッシュボード
while (running) {
List<AlarmResponseV5> alarms = client.alarm().list(100);
long critical = alarms.stream()
.filter(a -> "Y".equals(a.getIs_on()))
.filter(a -> "HI_HI".equals(a.getPriority()))
.count();
updateDashboard(alarms, critical);
Thread.sleep(1_000);
}
シナリオ — 特定資産ラインのアラームのみ
String targetLine = "SITE_DJ > A_0001 > L_0001";
List<AlarmResponseV5> lineAlarms = client.alarm().list(500).stream()
.filter(a -> a.getTag_location() != null
&& a.getTag_location().startsWith(targetLine))
.collect(Collectors.toList());