---
# System prepended metadata

title: ObjectVA API doc.

---

## ObjectVA

* Default port: 6090
* Default ssl port: 4473


### Login

* 說明：登入
* Path：/user/web/login
* Method：post

#### Request Interface:
```
interface ILogin_User {
    username: string;
    password: string;
}

type request = ILogin_User;
```

#### Response Interface:
```
interface IObject {
    objectId: string;
    name: string;
}
interface IWebLoginUser {
    objectId: string;
    roles: IObject[];
    username: string;
    name: string;
    email: string;
}
interface IWebLogin {
    sessionId: string;
    user: IWebLoginUser;
}

type response = IWebLogin;
```

#### Example
```
/// request
{{baseUrl}}/user/web/login
{
    "username": "signage_api_user",
    "password": "Aa123456*"
}

/// response
{
    "sessionId": "r:uvol4zlp3spsxv7x53qyavxdo7liwgoi",
    "user": {
        "objectId": "6285b1f0dab93262c0e2bf11",
        "roles": [
            {
                "objectId": "6285a9ba6627fa53fc3d8c40",
                "name": "Administrator"
            }
        ],
        "username": "signage_api_user",
        "name": "signage_api_user",
        "email": "signage_api_user@service.com"
    }
}
```

#### Status
* 200 - 成功
* 400 - 請求部分欄位缺失或型別錯誤
* 401 - 登入失敗，帳號密碼錯誤


***


### Maintain Session

* 說明：檢查Session 、取得帳號資料或是延長Session 使用期限 (1 小時)
* Path：/user/web/login
* Method：post

#### Request Interface:
```
interface ILogin_SessionId {
    sessionId: string;
}
```

#### Response Interface:
```
同Login API
```

#### Example
```
/// request
{{baseUrl}}/user/web/login
{
    "sessionId": "r:uvol4zlp3spsxv7x53qyavxdo7liwgoi"
}

/// response
{
    "sessionId": "r:uvol4zlp3spsxv7x53qyavxdo7liwgoi",
    "user": {
        "objectId": "6285b1f0dab93262c0e2bf11",
        "roles": [
            {
                "objectId": "6285a9ba6627fa53fc3d8c40",
                "name": "Administrator"
            }
        ],
        "username": "signage_api_user",
        "name": "signage_api_user",
        "email": "signage_api_user@service.com"
    }
}
```

#### Status
* 200 - 成功
* 400 - 請求部分欄位缺失或型別錯誤
* 401 - Session 過期或錯誤


***


### Get Source List

* 說明：取得所有影像來源清單 (使用時會延長一次Session 使用時間)
* Path：/source/all
* Method：get

#### Request Interface:
```
interface ISessionId {
    sessionId: string;
}

type request = ISessionId;
```

#### Response Interface:
```
enum ESourceType {
    /// 相機影像來源
    camera = "camera",
}

interface IMessage<T = string> {
    result: boolean;
    message: string;
    content: T;
}
interface IAll {
    objectId: string;
    name: string;
    type: string;
}

type response = IMessage<IAll[]>;
```

#### Example
```
/// request
{{baseUrl}}/source/all?sessionId={{sessionId}}

/// response
{
    "result": true,
    "message": "2021-09-17T02:17:36.611Z",
    "content": [
        {
            "objectId": "6143fabe40dcec5857331673",
            "name": "Camera 1",
            "type": "camera"
        }
    ]
}
```

### Status
* 200 - 成功
* 400 - 請求部分欄位缺失或型別錯誤
* 401 - 需要登入
* 403 - 登入帳號權限錯誤


***


### Live Report

* 說明：取得即時辨識報告 (連線期間自動延長Session 使用時間)
* Path：/report/live
* Method：websocket

#### Request Interface:
```
interface ISessionId {
    sessionId: string;
}
interface ILive {
    /// 欲取得影像來源辨識紀錄Id
    sourceId: string;
}

type request = ISessionId & ILive;
```

#### Response Interface:
```
enum ESourceType {
    /// 相機影像來源
    camera = "camera",
}
enum ESourceDetectAreaType {
    /// 排隊區域
    quening = "quening",
}

interface IWsResponse<T = string> {
    statusCode: number;
    message: T;
}
interface IModelResponse {
    /// 辨識模型Id
    id: string;
    /// 辨識模型 名稱
    name: string;
    description: string;
    format: string;
    inputWidth: number;
    inputHeight: number;
    /// 辨識模型可辨識物件
    labels: {
        id: string;
        /// 物件名稱 (請以此做比對)
        name: string;
    }[];
}
interface ILive_UserSource {
    /// 影像來源objectId
    objectId: string;
    /// 影像來源名稱
    name: string;
    /// 使用辨識模型
    model: IModelResponse;
}
interface ISourceDetectAreaCoordinate {
    /// 坐標軸X (依圖片寬度百分比，左上角為0)
    /// @range 0 - 1
    x: number;
    /// 坐標軸Y (依圖片高度百分比，左上角為0)
    /// @range 0 - 1
    y: number;
}
interface IDetectArea {
    /// 偵測區域objectId
    objectId: string;
    /// 偵測區域名稱
    name: string;
    /// 偵測區域類型
    type: string;
    /// 偵測區域座標
    coordinates: ISourceDetectAreaCoordinate[];
}
interface ILive_User {
    sessionId: string;
    source: ILive_UserSource;
    detectAreas: IDetectArea[];
}
interface ILive_Data {
    /// 辨識時間 (ISO String)
    date: Date;
    /// 影像來源
    camera: {
        /// 影像來源objectId
        objectId: string;
        /// 影像來源名稱
        name: string;
    };
    /// 辨識結果
    inference: {
        count: {
            in: number;
            out: number;
            pass: number;
            traffic: number;
        };
        triggerlines: {
            objectId: string;
            name: string;
            in: number;
            out: number;
        }[];
        /// 辨識物件
        objects: {
            id: number;
            /// 辨識物件Id
            trafficId: number;
            /// 辨識物件分數
            conf: number;
            /// 辨識物件門檻值
            threshold: number;
            /// 辨識物件物件總停留時間 (毫秒)
            aliveTime: number;
            /// 辨識物件物件名稱
            label: string;
            /// 辨識物件座標
            location: {
                /// 坐標軸X (依圖片寬度百分比，左上角為0)
                /// @range 0 - 1
                x: number;
                /// 坐標軸Y (依圖片高度百分比，左上角為0)
                /// @range 0 - 1
                y: number;
                /// 坐標軸寬度 (依圖片寬度百分比，左上角為0)
                /// @range 0 - 1
                width: number;
                /// 坐標軸高度 (依圖片高度百分比，左上角為0)
                /// @range 0 - 1
                height: number;
            };
            /// 辨識物件存在偵測區域
            areas: {
                /// 偵測區域objectId
                objectId: string;
                /// 偵測區域名稱
                name: string;
                /// 偵測區域停留時間 (毫秒)
                stayTime: number;
            }[];
        }[];
    };
}
type ILive = ILive_User | ILive_Data;

type response = IWsResponse | ILive;
```

#### Example
```
/// request
{{baseWsUrl}}/report/live?sessionId={{sessionId}}&sourceId=661e21418bfc68a540709c49

/// response (設定值，連線成功後會立即傳送一次並於有更新時會再傳送)
{
	"sessionId": "r:514fsgzt4tb00n4j1eqgxfx2wmhzqko2",
	"source": {
		"objectId": "661e21418bfc68a540709c49",
		"name": "Cleanroom Pass",
		"model": {
			"id": "rgNob6lK",
			"name": "cleanroom001",
			"description": "Azure Custom Vision Object Detection",
			"format": "azure_object_detect",
			"inputWidth": 320,
			"inputHeight": 320,
			"labels": [
				{
					"id": "0",
					"name": "Glove_L"
				},
				{
					"id": "1",
					"name": "Glove_NG"
				},
				{
					"id": "2",
					"name": "Glove_R"
				},
				{
					"id": "3",
					"name": "Hat"
				},
				{
					"id": "4",
					"name": "Hat_NG"
				},
				{
					"id": "5",
					"name": "Mask"
				},
				{
					"id": "6",
					"name": "Shoe_L"
				},
				{
					"id": "7",
					"name": "Shoe_NG"
				},
				{
					"id": "8",
					"name": "Shoe_R"
				}
			]
		}
	},
	"detectAreas": [
		{
			"objectId": "661e21418bfc68a540709c4a",
			"name": "Cleanroom Pass Q1",
			"type": "quening",
			"coordinates": [
				{
					"x": 0.317955112219451,
					"y": 0.077132743362832
				},
				{
					"x": 0.317955112219451,
					"y": 0.898230088495575
				},
				{
					"x": 0.670922693266833,
					"y": 0.898230088495575
				},
				{
					"x": 0.670922693266833,
					"y": 0.077132743362832
				}
			]
		}
	]
}

/// response (辨識紀錄)
{
    "date": "2024-06-11T10:03:29.324Z",
    "camera": {
        "objectId": "661e21418bfc68a540709c49",
        "name": "Cleanroom Pass"
    },
    "inference": {
        "count": {
            "in": 0,
            "out": 0,
            "pass": 0,
            "traffic": 9170
        },
        "triggerlines": [],
        "objects": [
            {
                "id": 1,
                "trafficId": 9165,
                "conf": 0.9792952,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Hat",
                "location": {
                    "x": 0.46197916666666666,
                    "y": 0.10925925925925926,
                    "width": 0.0703125,
                    "height": 0.10833333333333334
                },
                "areas": []
            },
            {
                "id": 2,
                "trafficId": 9166,
                "conf": 0.61675644,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Glove_L",
                "location": {
                    "x": 0.5802083333333333,
                    "y": 0.5324074074074074,
                    "width": 0.03854166666666667,
                    "height": 0.0824074074074074
                },
                "areas": [
                    {
                        "objectId": "661e21418bfc68a540709c4a",
                        "name": "Cleanroom Pass Q1",
                        "stayTime": 1132
                    }
                ]
            },
            {
                "id": 3,
                "trafficId": 9169,
                "conf": 0.41235736,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Glove_R",
                "location": {
                    "x": 0.396875,
                    "y": 0.5407407407407407,
                    "width": 0.036458333333333336,
                    "height": 0.09444444444444444
                },
                "areas": []
            },
            {
                "id": 4,
                "trafficId": 9167,
                "conf": 0.3063643,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Shoe_R",
                "location": {
                    "x": 0.43385416666666665,
                    "y": 0.712037037037037,
                    "width": 0.0578125,
                    "height": 0.10833333333333334
                },
                "areas": [
                    {
                        "objectId": "661e21418bfc68a540709c4a",
                        "name": "Cleanroom Pass Q1",
                        "stayTime": 910
                    }
                ]
            },
            {
                "id": 5,
                "trafficId": 9168,
                "conf": 0.30329338,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Shoe_L",
                "location": {
                    "x": 0.5197916666666667,
                    "y": 0.6944444444444444,
                    "width": 0.05520833333333333,
                    "height": 0.09814814814814816
                },
                "areas": [
                    {
                        "objectId": "661e21418bfc68a540709c4a",
                        "name": "Cleanroom Pass Q1",
                        "stayTime": 602
                    }
                ]
            },
            {
                "id": 6,
                "trafficId": 9170,
                "conf": 0.30088824,
                "threshold": 0.3,
                "aliveTime": 1335,
                "label": "Mask",
                "location": {
                    "x": 0.46458333333333335,
                    "y": 0.21296296296296297,
                    "width": 0.06302083333333333,
                    "height": 0.07592592592592592
                },
                "areas": [
                    {
                        "objectId": "661e21418bfc68a540709c4a",
                        "name": "Cleanroom Pass Q1",
                        "stayTime": 602
                    }
                ]
            }
        ]
    }
}
```

### Status
* 200 - 成功 (連線成功一定會傳一次)
* 401 - 需要登入
* 403 - 登入帳號權限錯誤