メインコンテンツまでスキップ

8. Tag サービス

client.tag() でアクセスします。Tagはデータポイント(センサー値、カウンタ、状態)の 定義(メタデータ) です。V5では タブ別PATCH 10種 により、アラーム・集計・計算などの詳細設定を安全に部分修正できます。

ID規則: TAG_ プレフィックスが必須です。詳細は ドメインID規則 を参照してください。

8.1 メソッド一覧

CRUD

メソッド戻り値の型HTTPエンドポイント
create(TagRequestV5)TagResponseV5 または nullPOST/api/v5/tag
update(tag_id, TagRequestV5)TagResponseV5 または nullPUT/api/v5/tag/{id}
delete(tag_id)booleanDELETE/api/v5/tag/{id}
get(tag_id)TagResponseV5 または nullGET/api/v5/tag/{id}
exists(tag_id)booleanGET/api/v5/tag/{id}/exists

一覧 / カウント

メソッド戻り値の型HTTPエンドポイント
list()List<TagResponseV5>GET/api/v5/tag
listBySite(site_id)List<TagResponseV5>GET/api/v5/tag?site_id=...
listByOpc(opc_id)List<TagResponseV5>GET/api/v5/tag?opc_id=...
listByAsset(asset_id)List<TagResponseV5>GET/api/v5/tag?asset_id=...
count()longGET/api/v5/tag/count
countBySite(site_id)longGET/api/v5/tag/count?site_id=...
countByOpc(opc_id)longGET/api/v5/tag/count?opc_id=...
countByAsset(asset_id)longGET/api/v5/tag/count?asset_id=...

PATCH — タブ別部分修正(V5の中核機能)

10種のPATCHは nullフィールド = 変更しない という規則に従います(サーバーDAOで COALESCE 処理)。一部のPATCHは、サーバー側でCEP/EQLの再デプロイまで自動実行します。

メソッドHTTPエンドポイント副作用
patchBasic(id, TagBasicPatchRequestV5)PATCH/api/v5/tag/{id}/basic
patchAlarm(id, TagAlarmPatchRequestV5)PATCH/api/v5/tag/{id}/alarmCEP/EQL 再デプロイ
patchMetadata(id, TagMetadataPatchRequestV5)PATCH/api/v5/tag/{id}/metadata
patchCalculation(id, TagCalculationPatchRequestV5)PATCH/api/v5/tag/{id}/calculationdeployCalculation 再呼び出し
patchSampling(id, TagSamplingPatchRequestV5)PATCH/api/v5/tag/{id}/sampling
patchAggregation(id, TagAggregationPatchRequestV5)PATCH/api/v5/tag/{id}/aggregationdeployAggregation 再呼び出し
patchAi(id, TagAiPatchRequestV5)PATCH/api/v5/tag/{id}/ai
patchPublish(id, TagPublishPatchRequestV5)PATCH/api/v5/tag/{id}/publish
patchAttribute(id, TagAttributePatchRequestV5)PATCH/api/v5/tag/{id}/attribute
patchLink(id, TagLinkPatchRequestV5)PATCH/api/v5/tag/{id}/link

8.2 TagRequestV5 / TagResponseV5(全体登録・修正用)

フィールド説明
tag_idStringタグID(PK、TAG_ 必須)
tag_nameString表示名
opc_idString所属OPC(FK)
site_idString所属サイト
linked_asset_idString接続された資産(Equipment)
java_typeString値のデータ型 — Double, Float, Int, Long, Short, Boolean, String, Date
unitString単位(例: , RPM, kPa
tag_sourceStringデータ出所(例: OPC, API, FILE
descriptionString説明

8.3 PATCH DTO フィールド(タブ別)

TagBasicPatchRequestV5(基本)

フィールド説明
tag_name表示名
java_typeデータ型
description説明

TagMetadataPatchRequestV5(メタデータ)

フィールド説明
tag_typeタグ種別
importance重要度(1~10)
tag_source出所
use_metricメトリクス使用の有無
rate収集周期(ms)
rw読み取り/書き込み(R/W/RW
alias_nameエイリアス
min_value / max_value測定範囲
display_formatUI表示形式
unit単位
number_round / number_scale丸め / 小数点
io_address / source_tag_nameI/Oアドレス・元のタグ名
lat / lng緯度経度

TagAlarmPatchRequestV5(アラーム)

フィールド説明
trip_hi, hi_hi, hi, lo, lo_lo, trip_loしきい値(6段階)
bool_true, bool_true_priority, bool_true_messageブールTRUEアラーム
bool_false, bool_false_priority, bool_false_messageブールFALSEアラーム
band_message正常バンドメッセージ
duplicate_check_minutes重複アラーム抑止時間(分)
user_defined_alarm_classユーザー定義クラス
use_alarmアラーム使用(Y/N
recieve_me, recieve_others本人/他者への通知
send_email, send_smsメール/SMS送信

TagCalculationPatchRequestV5(計算)

フィールド説明
calculation_eqlEQL式
use_calculation使用の有無(Y/N

TagSamplingPatchRequestV5(サンプリング)

フィールド説明
use_sampling使用の有無(Y/N

TagAggregationPatchRequestV5(集計)

フィールド説明
use_aggregation使用の有無
aggregation_1_minutesaggregation_1_hours5種類の周期の有効化フラグ

TagAiPatchRequestV5(AI異常診断)

フィールド説明
use_target学習対象
use_categoryカテゴリ分類の使用

TagPublishPatchRequestV5(発行)

フィールド説明
publish_mqttMQTT発行(Y/N
publish_kafkaKafka発行(Y/N

TagAttributePatchRequestV5(ノート)

フィールド説明
note自由形式メモ

TagLinkPatchRequestV5(設備マッピング)

フィールド説明
linked_asset_id接続資産ID。空文字列 = マッピング解除

8.4 使用例

Tag の作成(OPC接続タグ)

import plantpulse.api.v5.dto.request.TagRequestV5;
import plantpulse.api.v5.dto.response.TagResponseV5;

TagRequestV5 req = new TagRequestV5();
req.setTag_id("TAG_EDGE_00303_90007");
req.setTag_name("Spindle RPM");
req.setOpc_id("OPC_EDGE_00303");
req.setSite_id("SITE_DJ");
req.setLinked_asset_id("ASSET_DJ_M_0001");
req.setJava_type("Double");
req.setUnit("RPM");
req.setTag_source("OPC");
req.setDescription("Spindle 회전수");

TagResponseV5 created = client.tag().create(req);

単件照会 / 存在確認

TagResponseV5 tag = client.tag().get("TAG_EDGE_00303_90007");
if (tag != null) {
System.out.println(tag.getTag_name() + " (" + tag.getUnit() + ")");
}

boolean exists = client.tag().exists("TAG_EDGE_00303_90007");

サイト / OPC / アセット別の一覧

List<TagResponseV5> siteTags = client.tag().listBySite("SITE_DJ");
List<TagResponseV5> opcTags = client.tag().listByOpc("OPC_PLC_L1_001");
List<TagResponseV5> assetTags = client.tag().listByAsset("ASSET_DJ_M_0001");

カウント

long total = client.tag().count();
long siteTotal = client.tag().countBySite("SITE_DJ");
long opcTotal = client.tag().countByOpc("OPC_PLC_L1_001");
long assetTotal = client.tag().countByAsset("ASSET_DJ_M_0001");

全体修正(PUT)

全フィールドを再送信する場合:

TagRequestV5 update = new TagRequestV5();
update.setTag_id("TAG_EDGE_00303_90007");
update.setTag_name("Spindle RPM (변경됨)");
update.setOpc_id("OPC_EDGE_00303");
update.setSite_id("SITE_DJ");
update.setJava_type("Double");
update.setUnit("RPM");
// ... 모든 필드 ...
client.tag().update("TAG_EDGE_00303_90007", update);

部分修正 — patchBasic

名前と説明のみを変更:

import plantpulse.api.v5.dto.request.TagBasicPatchRequestV5;

TagBasicPatchRequestV5 patch = new TagBasicPatchRequestV5();
patch.setTag_name("Spindle RPM (보정 후)");
patch.setDescription("2026-05-14 보정 적용");
// java_type 은 null 로 두면 변경 안 함
client.tag().patchBasic("TAG_EDGE_00303_90007", patch);

部分修正 — patchAlarm

アラームしきい値の設定(サーバー側でCEP/EQLを再デプロイ):

import plantpulse.api.v5.dto.request.TagAlarmPatchRequestV5;

TagAlarmPatchRequestV5 alarm = new TagAlarmPatchRequestV5();
alarm.setUse_alarm("Y");
alarm.setLo_lo("0");
alarm.setLo("10");
alarm.setHi("80");
alarm.setHi_hi("95");
alarm.setTrip_hi("100");
alarm.setDuplicate_check_minutes(5);
alarm.setSend_email("Y");
client.tag().patchAlarm("TAG_EDGE_00303_90007", alarm);

部分修正 — patchMetadata

エイリアスと表示形式の変更:

import plantpulse.api.v5.dto.request.TagMetadataPatchRequestV5;

TagMetadataPatchRequestV5 meta = new TagMetadataPatchRequestV5();
meta.setAlias_name("HMI_TAG_RPM_01");
meta.setDisplay_format("#,##0");
meta.setNumber_scale(0);
meta.setImportance(8);
client.tag().patchMetadata("TAG_EDGE_00303_90007", meta);

部分修正 — patchCalculation

EQL計算式の付与(サーバー側でdeployCalculationを再呼び出し):

import plantpulse.api.v5.dto.request.TagCalculationPatchRequestV5;

TagCalculationPatchRequestV5 calc = new TagCalculationPatchRequestV5();
calc.setUse_calculation("Y");
calc.setCalculation_eql("VAL('TAG_RAW_RPM') * 60 / 1000"); // 가상의 EQL
client.tag().patchCalculation("TAG_EDGE_00303_90007", calc);

部分修正 — patchAggregation

5種類の周期集計を有効化(deployAggregationを再呼び出し):

import plantpulse.api.v5.dto.request.TagAggregationPatchRequestV5;

TagAggregationPatchRequestV5 agg = new TagAggregationPatchRequestV5();
agg.setUse_aggregation("Y");
agg.setAggregation_1_minutes("Y");
agg.setAggregation_5_minutes("Y");
agg.setAggregation_10_minutes("Y");
agg.setAggregation_30_minutes("N");
agg.setAggregation_1_hours("Y");
client.tag().patchAggregation("TAG_EDGE_00303_90007", agg);

部分修正 — patchPublish

MQTT/Kafka発行のトグル:

import plantpulse.api.v5.dto.request.TagPublishPatchRequestV5;

TagPublishPatchRequestV5 pub = new TagPublishPatchRequestV5();
pub.setPublish_mqtt("Y");
pub.setPublish_kafka("N");
client.tag().patchPublish("TAG_EDGE_00303_90007", pub);

部分修正 — patchLink(資産マッピング)

import plantpulse.api.v5.dto.request.TagLinkPatchRequestV5;

// 자산에 연결
TagLinkPatchRequestV5 link = new TagLinkPatchRequestV5();
link.setLinked_asset_id("ASSET_DJ_M_0001");
client.tag().patchLink("TAG_EDGE_00303_90007", link);

// 매핑 해제 — 빈 문자열
TagLinkPatchRequestV5 unlink = new TagLinkPatchRequestV5();
unlink.setLinked_asset_id("");
client.tag().patchLink("TAG_EDGE_00303_90007", unlink);

削除

boolean ok = client.tag().delete("TAG_EDGE_00303_90007");

8.5 活用シナリオ

シナリオ — 新規ラインのタグを自動分類してから一括設定

// 1) 자동 등록된 태그 목록 (OPC 연결 직후)
List<TagResponseV5> tags = client.tag().listByOpc("OPC_PLC_L2_001");

// 2) 이름 패턴으로 자산 자동 연결 + 알람 일괄 설정
for (TagResponseV5 t : tags) {
String name = t.getTag_name();

// 자산 매핑
TagLinkPatchRequestV5 link = new TagLinkPatchRequestV5();
if (name.contains("CNC1")) {
link.setLinked_asset_id("ASSET_DJ_M_CNC1");
} else if (name.contains("CNC2")) {
link.setLinked_asset_id("ASSET_DJ_M_CNC2");
} else {
continue;
}
client.tag().patchLink(t.getTag_id(), link);

// 온도 태그는 알람 임계치 자동 설정
if (name.endsWith("_TEMP")) {
TagAlarmPatchRequestV5 alarm = new TagAlarmPatchRequestV5();
alarm.setUse_alarm("Y");
alarm.setHi("80");
alarm.setHi_hi("95");
client.tag().patchAlarm(t.getTag_id(), alarm);
}
}

シナリオ — 集計と発行をまとめて有効化

String tagId = "TAG_EDGE_00303_90007";

TagAggregationPatchRequestV5 agg = new TagAggregationPatchRequestV5();
agg.setUse_aggregation("Y");
agg.setAggregation_1_minutes("Y");
agg.setAggregation_1_hours("Y");
client.tag().patchAggregation(tagId, agg);

TagPublishPatchRequestV5 pub = new TagPublishPatchRequestV5();
pub.setPublish_mqtt("Y");
client.tag().patchPublish(tagId, pub);

次のステップ