ProEye-X API
会社専用インスタンス(https://会社.proeye-x.com)の作業分析データを、MES・ERP・BI などの外部システムから読み書きする方法です。すべての呼び出しは JSON-RPC 2.0 で POST /jsonrpc に送ります。
はじめに
エンドポイント
アドレスは会社インスタンスごとに異なります。DB 名は会社アドレスの先頭部分(会社)と同じです。
POST https://company.proeye-x.com/jsonrpc
API キーの作成
インスタンスにログイン → 右上のユーザーメニュー › マイプロフィール(設定)› アカウントセキュリティ ›「新しい API キー」。キーはパスワードの代わりに使い、作成時に一度だけ表示されます。キーはサーバー側のプログラムにのみ保存し、ブラウザのコードには入れないでください。
認証(uid の取得)
ログインメールと API キーでユーザー番号(uid)を取得し、以降のすべての呼び出しに DB・uid・API キーを付けて送ります。
curl -s https://company.proeye-x.com/jsonrpc \
-H "Content-Type: application/json" \
-d '{"jsonrpc": "2.0", "method": "call", "params": {
"service": "common", "method": "authenticate",
"args": ["company", "you@company.com", "YOUR_API_KEY", {}]}}'
# → {"jsonrpc": "2.0", "id": null, "result": 7} (7 = uid)Python ヘルパー
以下の例はこのヘルパー関数 model() を使います。
import requests
URL = "https://company.proeye-x.com/jsonrpc"
DB, LOGIN, KEY = "company", "you@company.com", "YOUR_API_KEY"
def call(service, method, *args):
r = requests.post(URL, json={"jsonrpc": "2.0", "method": "call",
"params": {"service": service, "method": method, "args": args}}, timeout=30)
r.raise_for_status()
body = r.json()
if body.get("error"):
raise RuntimeError(body["error"]["data"]["message"])
return body.get("result") # no "result" key when the method returns nothing
UID = call("common", "authenticate", DB, LOGIN, KEY, {})
def model(name, method, args, kw=None):
return call("object", "execute_kw", DB, UID, KEY, name, method, args, kw or {})言語
context に lang を指定すると、作業名・要素作業名がその言語で返ります(翻訳がある場合)。例: {"context": {"lang": "ja_JP"}} · en_US · zh_CN · zh_TW · vi_VN · th_TH · id_ID · es_ES · de_DE · ko_KR。
エラー
失敗すると HTTP 200 で "error" オブジェクトが返ります。error.data.message に理由(権限なし・必須項目の不足など)があります。
API 一覧
element_type は作業種類スロットのキーです(va = 1番、nva = 2番、wait = 3番、ユーザー定義スロットは c4 …)。VA/NVA 時間は segment_data の区間から計算されます。
1. 作業分析一覧
作業分析(セッション)の一覧と CT 平均・VA 率・要素作業数を取得します。
rows = model("wa.session", "search_read", [[]], {
"fields": ["o_no", "name", "process_name", "cycle_time_avg", "va_ratio", "element_count"],
"order": "date desc", "limit": 20,
"context": {"lang": "en_US"}, # names in English (optional)
})curl -s https://company.proeye-x.com/jsonrpc -H "Content-Type: application/json" -d '{
"jsonrpc": "2.0", "method": "call", "params": {"service": "object", "method": "execute_kw",
"args": ["company", 7, "YOUR_API_KEY", "wa.session", "search_read", [[]],
{"fields": ["o_no", "name", "cycle_time_avg", "va_ratio"], "limit": 20}]}}'[{"id": 6, "o_no": "O-ENG-NOVICE-01", "name": "Engine Assembly - Novice",
"process_name": "Engine Assembly Work", "cycle_time_avg": 165.33, "va_ratio": 63.7, "element_count": 14}]2. 要素作業の取得
1つの作業分析の要素作業をサイクル別に取得します。開始・終了時間(秒)、標準時間、VA・NVA 時間を含みます。 cycle_no はその要素作業が何番目のサイクルかを表します(1, 2, 3 …)。
elements = model("wa.element", "search_read",
[[["session_id", "=", 6], ["cycle_no", "=", 1]]],
{"fields": ["cycle_no", "sequence", "name", "element_type", "video_start_time", "video_end_time",
"standard_time", "va_time", "nva_time"], "order": "cycle_no, sequence"})
# every cycle: drop the ["cycle_no", "=", 1] condition — cycle_no tells which cycle each element belongs to[{"id": 70, "cycle_no": 1, "sequence": 1, "name": "Fetch the tools and prepare.", "element_type": "wait",
"video_start_time": 189.656, "video_end_time": 198.398, "standard_time": 8.742,
"va_time": 4.104, "nva_time": 4.638}, ...]3. LOSS の取得
LOSS タブで入力した内容を取得します。要素作業の NVA 区間(segment_data の type = nva)ごとに、LOSS 内容(loss_data)と ムダの種類コード(loss_type_data)が同じ順序の JSON 配列で保存されています。下のように対応付けると、サイクル・要素作業・区間時間・ムダの種類・LOSS 内容の行になります。
import json
rows = model("wa.element", "search_read", [[["session_id", "=", session_id]]],
{"fields": ["cycle_no", "sequence", "name", "segment_data", "loss_data", "loss_type_data"],
"order": "cycle_no, sequence"})
losses = []
for e in rows:
nva = [s for s in json.loads(e["segment_data"] or "[]") if s["type"] == "nva"]
notes = json.loads(e["loss_data"] or "[]") # LOSS text, one per NVA segment
types = json.loads(e["loss_type_data"] or "[]") # waste type code, one per NVA segment
for i, seg in enumerate(nva):
losses.append({"cycle_no": e["cycle_no"], "element": e["name"],
"start": seg["start"], "end": seg["end"], "dur": seg["dur"],
"loss_type": types[i] if i < len(types) else "",
"loss": notes[i] if i < len(notes) else ""})# rows (raw)
[{"id": 207, "cycle_no": 1, "sequence": 1, "name": "Fasten bolt",
"segment_data": "[{\"type\": \"va\", \"start\": 4.2, \"end\": 7.0, \"dur\": 2.8}, {\"type\": \"nva\", \"start\": 7.0, ...}]",
"loss_data": "[\"Searching for the wrench\", \"Waiting for the jig\"]",
"loss_type_data": "[\"w6\", \"w2\"]"}]
# losses
[{"cycle_no": 1, "element": "Fasten bolt", "start": 7.0, "end": 9.1, "dur": 2.1, "loss_type": "w6", "loss": "Searching for the wrench"},
{"cycle_no": 1, "element": "Fasten bolt", "start": 11.0, "end": 12.6, "dur": 1.6, "loss_type": "w2", "loss": "Waiting for the jig"}]
# loss_type: w1 overproduction · w2 waiting · w3 transport · w4 over-processing · w5 inventory · w6 motion · w7 defects4. 作業分析の作成
新しい作業分析を作成します。O-No(一意の番号)は必須で、重複できません。新しい ID を返します。
session_id = model("wa.session", "create", [{
"o_no": "O-2026-LINE3-01", # required, unique
"name": "Line 3 sub-assembly",
"process_name": "Sub-assembly",
}])21
5. 要素作業の追加
動画の時間区間で要素作業をまとめて追加します。CT・VA 率などの集計は自動で再計算されます。
ids = model("wa.element", "create", [[
{"session_id": session_id, "cycle_no": 1, "sequence": 1, "name": "Pick part",
"element_type": "va", "video_start_time": 0.0, "video_end_time": 4.2},
{"session_id": session_id, "cycle_no": 1, "sequence": 2, "name": "Fasten bolt",
"element_type": "va", "video_start_time": 4.2, "video_end_time": 9.8},
]])
summary = model("wa.session", "read", [[session_id]],
{"fields": ["element_count", "cycle_time_avg", "va_ratio"]})[205, 206]
[{"id": 18, "element_count": 2, "cycle_time_avg": 9.8, "va_ratio": 100.0}]6. 要素作業の変更・削除
名前・時間・作業種類を変更(write)または削除(unlink)します。
model("wa.element", "write", [[205], {"name": "Pick and place", "video_end_time": 4.6}])
model("wa.element", "unlink", [[206]])true true
7. LOSS の入力
NVA 区間ごとの LOSS 内容と ムダの種類コードを時間順の JSON 配列で書き込みます。配列の n 番目の値が n 番目の NVA 区間に対応します。コード: w1 つくりすぎ・w2 手待ち・w3 運搬・w4 加工そのもの・w5 在庫・w6 動作・w7 不良。
import json
# element with NVA segments 7.0–9.1 s and 11.0–12.6 s → one entry per NVA segment, in time order
model("wa.element", "write", [[207], {
"loss_data": json.dumps(["Searching for the wrench", "Waiting for the jig"]),
"loss_type_data": json.dumps(["w6", "w2"]),
}])true
8. サイクルの取得
測定したサイクルの開始・終了とサイクルタイムを取得します。
cycles = model("wa.cycle", "search_read", [[["session_id", "=", 4]]],
{"fields": ["sequence", "video_start", "video_end", "cycle_time"], "order": "sequence"})[{"id": 4, "sequence": 1, "video_start": 0.767, "video_end": 17.15, "cycle_time": 16.383}, ...]9. 比較分析(改善前・後)
2つの作業分析を比較分析にまとめて比較ラインを作成し、CT 短縮・VA 改善と要素作業ごとの差を取得します。
cid = model("wa.comparison", "create", [{
"name": "Line 1 before / after", "session_a_id": 7, "session_b_id": 11}])
model("wa.comparison", "action_build_lines", [[cid]])
result = model("wa.comparison", "read", [[cid]],
{"fields": ["ct_a", "ct_b", "ct_reduction", "ct_reduction_pct", "va_improvement"]})
lines = model("wa.comparison.line", "search_read", [[["comparison_id", "=", cid]]],
{"fields": ["sequence", "step_name", "time_a", "time_b", "time_diff"], "order": "sequence"})[{"id": 3, "ct_a": 22.72, "ct_b": 23.39, "ct_reduction": -0.67, "ct_reduction_pct": -2.9, "va_improvement": -6.4}]
[{"id": 49, "sequence": 1, "step_name": "UP", "time_a": 2.85, "time_b": 2.723, "time_diff": -0.127}, ...]10. ラインバランス
タクトタイム・ライン効率・ボトルネック工程と、工程ごとのサイクルタイム・負荷率を取得します。
lines = model("wa.linebalance", "search_read", [[]],
{"fields": ["name", "takt_time", "lb_efficiency", "bottleneck_name", "max_ct"]})
processes = model("wa.lb.process", "search_read", [[["lb_id", "=", lines[0]["id"]]]],
{"fields": ["sequence", "process_name", "cycle_time", "load_ratio", "over_takt"],
"order": "sequence"})[{"id": 1, "name": "LB_Robot Assembly Line MAC Analysis", "takt_time": 27.74,
"lb_efficiency": 90.0, "bottleneck_name": "Robot Assembly Line (After Improvement)", "max_ct": 27.74}]
[{"id": 1, "sequence": 10, "process_name": "Robot Assembly Line (After Improvement)",
"cycle_time": 23.39, "load_ratio": 84.3, "over_takt": false}, ...]11. MMC・MAC
人-機械分析(MMC)と多重作業分析(MAC)の時間構成・稼働率を取得します。
mmc = model("wa.mmc", "search_read", [[]],
{"fields": ["name", "total_time", "machine_time", "walk_time", "wait_time", "load_ratio"]})
mac = model("wa.mac", "search_read", [[]],
{"fields": ["name", "process_count", "takt_time", "avg_ct", "utilization", "balance_eff"]})[{"id": 1, "name": "Engine Assembly Line", "total_time": 165.33, "machine_time": 0.0,
"walk_time": 0.0, "wait_time": 0.0, "load_ratio": 100.0}]
[{"id": 1, "name": "Robot Assembly Line MAC Analysis", "process_count": 4, "takt_time": 0.0,
"avg_ct": 24.97, "utilization": 0.0, "balance_eff": 90.0}]すべてのフィールドは fields_get で確認できます: model("wa.session", "fields_get", [], {"attributes": ["string", "type"]})