# MO API 格式 (2023/02/21) [TOC] ## Object API #### **[POST]** /v1/object * Request ``` { "object_type" : string, "name" : string, "object_id" : string, "templates" : [ { "template": "ac_comfort_template", "template_name" : "name show on UI", "feature" : { "example_field1" : "cold", "example_field2" : null, #使用者沒有填的空欄位填null ... }, "goal_setting" : [{}, {}, ...], "active" : bool, "datasource":{ "storage_name":"db123", "type":"influxdb", "config":{ "database":"8adbf4ba-0468-4949-861a-ece029218761", "username":"0d3db427-588f-4716-96e4-6d967ebdd5cb", "password":"N2fvaFBAIbzPiC5k3pJxGN1kt", "host":"60.250.255.134", "port":8086 } } }, { "template": "other_template", "template_name" : "name show on UI", "feature" : { ... }, "goal_setting" : [{}, {}, ...], "active" : bool, "datasource": {} } ] } ``` * Response ``` # 正確新增object { "errCode" : 200, "data" : "success" } # 新增object時有錯誤 { "errCode" : 600 "data" : string # explain why error happens } ``` #### **[PUT]** /v1/object/{object_id} * Request ``` { "object_type" : string, "name" : string, "object_id" : string, "templates" : [ { "template": "ac_comfort_template", "template_name" : "name show on UI", "feature" : { "example_field1" : "cold", "example_field2" : 100, ... }, "goal_setting" : [{}, {}, ...], "active" : bool, "datasource:{ "storage_name":"db123", "type":"influxdb", "config":{ "database":"8adbf4ba-0468-4949-861a-ece029218761", "username":"0d3db427-588f-4716-96e4-6d967ebdd5cb", "password":"N2fvaFBAIbzPiC5k3pJxGN1kt", "host":"60.250.255.134", "port":8086 } } }, { "template": "other_template", "template_name" : "name show on UI", "feature" : { ... }, "goal_setting" : [{}, {}, ...], "active" : bool, "datasource": {} } ] } ``` * Response ``` # 正確更改object { "errCode" : 200, "data" : "success" } # 更改object時有錯誤 { "errCode" : int, # define yourself "data" : string # explain why error happens } ``` #### **[DELETE]** /v1/object * Request ``` { "object_ids" : [] # object_id string array } ``` * Response ``` # 正確刪除object { "errCode" : 200, "data" : "success" } # 刪除object時有錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### **[GET]** /v1/object/status/{object_id} * 等goal setting更改好以及模型管理API完成再回頭串 * Response ``` { "errCode" : 200, "data" : { "templates" : [ { "template" : string, "template_name" : "name show on UI", "status": string, "model_name" : string, "prediction_time" : string }, { "template" : string, "template_name" : "name show on UI", "status": string, "model_name" : string, "prediction_time" : string }, { "template" : string, "template_name" : "name show on UI", "status": string, "model_name" : string, "prediction_time" : string } ] } } # Get object status 有錯誤 { "errCode" : 600 "data" : string # explain why error happens } ``` #### **[GET]** /v1/object/info/{object_id} * /v1/object: 建立新的object需要的欄位,(每個template傳一組goal_setting即可) * /v1/object/info/{object_id} : 拿到已建立好的object欄位值 * Response ``` { "errCode" : 200, "data" : { "object_type" : string, "name" : string, "object_id" : string, "templates" : [ { "template": "ac_comfort_template", "template_name" : "name show on UI", "feature" : { ... }, "goal_setting" : [{}, {}, ...], "active" : bool }, { "template": "other_template", "template_name" : "name show on UI", "feature" : { ... }, "goal_setting" : [{}, {}, ...], "active" : bool } ] } } # Get object 有錯誤 { "errCode" : 600 "data" : string # explain why error happens } ``` **Note : feature、goal_setting,欄位格式如下範例** ``` "featue" : { "ac_switch" : { "select_type" : "fixed" or "datasource" 固定欄位或是從datasource "name" : "辦公區空調開關", # 欄位顯示名稱 "value" : null, # 可填預設或空值 (使用者輸入後則會取代) "need" : true, # 是否必填 "type" : bool, # 資料型態 (bool, string, int, float, time, option、multi-option) # time格式 : "08:00" 24H,一個小時為單位 "option" : { # 如果資料型態為option,需提供選項內容,以及存下對應的string or int "星期一" : 1 "星期二" : Tuesday, }, "limit" : [0, 100] # 如果資料型態為int or float,需提供上下限 "description" : "", # 欄位下面的說明文字 } } ``` ## [AI TEMPLATE] 1. AI Template分設備分AI應用,倆倆都不同 - Ex: 大型空調的能源預測 跟 冰機的能源預測 欄位就會不一樣 2. 大型空調: + AC Thermal Comfort Optimization + AC Energy Demand Prediction 3. 冰機: + Chiller Energy Demand Prediction #### **1. Thermal Comfort Optimization** ``` { "template": "air_conditioning_system-energy_consumption_prediction", "template_name": "Energy Consumption Prediction", "feature": { "ac_switch": { "name": "AC Switch", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "ac_temp": { "name": "AC Temperature", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "ac_wind": { "name": "AC Wind Speed", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "indoor_temp": { "name": "Indoor Temperature", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "indoor_humid": { "name": "Indoor Humidity", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "outdoor_temp": { "name": "Outdoor Temperature", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "outdoor_humid": { "name": "Outdoor Humidity", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "ac_power": { "name": "AC Power", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "" }, "ac_mode": { "name": "AC Mode", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "" }, "outdoor_air_quality": { "name": "Outdoor Air Quality", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "" }, "indoor_air_quality": { "name": "Indoor Air Quality", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "" } }, "goal_setting": { "thermal_comfort_zone": { "name": "Thermal Comfort Zone", "select_type": "fixed", "value": null, "need": True, "type": "multi-option", "option": { "冷": 1, "稍冷": 2, "舒適偏冷": 3, "適中": 4, "舒適偏熱": 5, "稍熱": 6, "熱": 7 }, "description": "" }, "week": { "name": "Week", "select_type": "fixed", "value": null, "need": True, "type": "multi-option", "option": { "Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6, "Sunday": 7 }, "description": "" }, "start_time": { "name": "Start", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" }, "end_time": { "name": "End", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" } } } ``` #### **2. Air Conditioning - Energy Consumption Prediction** ``` { "template": "air_conditioning_system-thermal_comfort_optimization", "template_name": "Thermal Comfort Optimization" "feature": { "pred_freq": { "name": "Prediction Frequency", "select_type": "fixed", "value": null, "need": True, "type": "option", "option": { "Daily": "day", "Hourly": "hour" }, "description": "" }, "load_rate": { "name": "Load Rate", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "indoor_temp": { "name": "Indoor Temperature", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "indoor_humid": { "name": "Indoor Humidity", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "outdoor_temp": { "name": "Outdoor Temperature", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "outdoor_humid": { "name": "Outdoor Humidity", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" } }, "goal_setting": { "mild_threshold": { "name": "Mild warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "moderate_threshold": { "name": "Moderate warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "severe_threshold": { "name": "Severe warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "week": { "name": "Week", "select_type": "fixed", "value": null, "need": True, "type": "multi-option", "option": { "Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6, "Sunday": 7 }, "description": "" }, "start_time": { "name": "Start", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" }, "end_time": { "name": "End", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" } } } ``` #### **3. Chiller - Energy Demand Prediction** ``` { "template": "chiller_system-energy_demand_prediction", "template_name": "Energy Consumption Prediction", "feature": { "pred_freq": { "name": "Prediction Frequency", "select_type": "fixed", "value": null, "need": True, "type": "option", "option": { "Daily": "day", "Hourly": "hour" }, "description": "" }, "load_rate": { "name": "Load Rate", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "inlet_temp": { "name": "Inlet Water Temperature", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "outlet_temp": { "name": "Outlet Water Temperature", "select_type": "datasource", "value": null, "need": True, "type": "string", "option": {}, "description": "" }, "indoor_temp": { "name": "Indoor Temperature", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "indoor_humid": { "name": "Indoor Humidity", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "outdoor_temp": { "name": "Outdoor Temperature", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" }, "outdoor_humid": { "name": "Outdoor Humidity", "select_type": "datasource", "value": null, "need": False, "type": "string", "option": {}, "description": "Model performance may be affected if the field is blank" } }, "goal_setting": { "mild_threshold": { "name": "Mild warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "moderate_threshold": { "name": "Moderate warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "severe_threshold": { "name": "Severe warning threshold", "select_type": "", "value": null, "need": True, "type": "int", "option": {}, "limit": [ 0, 1000000 ], "description": "" }, "week": { "name": "Week", "select_type": "fixed", "value": null, "need": True, "type": "multi-option", "option": { "Monday": 1, "Tuesday": 2, "Wednesday": 3, "Thursday": 4, "Friday": 5, "Saturday": 6, "Sunday": 7 }, "description": "" }, "start_time": { "name": "Start", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" }, "end_time": { "name": "End", "select_type": "", "value": null, "need": True, "type": "time", "option": {}, "description": "" } } } ``` #### **4. Object example - air_conditioning_system** ``` example = {"object_type":"air_conditioning_system", "name": "test_object", "object_id":"id1234", "templates":[ { "template": "air_conditioning_system-thermal_comfort_optimization", "template_name": "air_conditioning_system-thermal_comfort_optimization", "feature":{ "ac_switch": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公區空調開關數值", "ac_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公區空調溫度數值", "ac_wind": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公區空調風速數值", "indoor_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溫度", "indoor_humid": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溼度", "outdoor_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_溫度", "outdoor_humid": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_濕度", "ac_power": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公室空調用電", "ac_mode": null, "outdoor_air_quality":null, "indoor_air_quality":null }, "goal_setting":[ { "thermal_comfort_zone":[3,4], "week":[1,2,3,4,5], "start_time":"08:00", "end_time":"18:00" } ], "active": True, "datasource":{ "storage_name":"db123", "type":"influxdb", "config":{ "database":"8adbf4ba-0468-4949-861a-ece029218761", "username":"0d3db427-588f-4716-96e4-6d967ebdd5cb", "password":"N2fvaFBAIbzPiC5k3pJxGN1kt", "host":"60.250.255.134", "port":8086 } } }, { "template": "air_conditioning_system-energy_consumption_prediction", "template_name": "air_conditioning_system-energy_consumption_prediction", "feature":{ "pred_freq": "hour", "load_rate": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公室空調用電", "indoor_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溫度", "indoor_humid": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溼度", "outdoor_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_溫度", "outdoor_humid": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_濕度" }, "goal_setting":[ { "mild_threshold": 70, "moderate_threshold": 100, "severe_threshold": 200, "week":[1,2,3,4,5], "start_time":"08:00", "end_time":"18:00" }, { "mild_threshold": 50, "moderate_threshold": 80, "severe_threshold": 100, "week":[6,7], "start_time":"08:00", "end_time":"18:00" }, ], "active": True, "datasource":{ "storage_name":"db123", "type":"influxdb", "config":{ "database":"8adbf4ba-0468-4949-861a-ece029218761", "username":"0d3db427-588f-4716-96e4-6d967ebdd5cb", "password":"N2fvaFBAIbzPiC5k3pJxGN1kt", "host":"60.250.255.134", "port":8086 } } } ] } ``` #### **5. Object example - chiller_system** ``` example3 = {"object_type":"chiller_system", "name": "test_object4", "object_id":"id999", "templates":[ { "template": "chiller_system-energy_demand_prediction", "template_name": "chiller_system-energy_demand_prediction", "feature":{ "pred_freq": "hour", "load_rate": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_辦公室空調用電", "inlet_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溫度", "outlet_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溫度", "indoor_temp": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溫度", "indoor_humid": "HistRawData_a650f1b2-46e1-46a2-b4f2-5b99fb5d1ccd_室內溼度", "outdoor_temp": null, "outdoor_humid": null }, "goal_setting":[ { "mild_threshold": 70, "moderate_threshold": 80, "severe_threshold": 90, "week":[1,2,3,4], "start_time":"00:00", "end_time":"18:00" }, { "mild_threshold": 100, "moderate_threshold": 110, "severe_threshold": 120, "week":[4], "start_time":"20:00", "end_time":"23:00" }, ], "active": True, "datasource":{ "storage_name":"db123", "type":"influxdb", "config":{ "database":"8adbf4ba-0468-4949-861a-ece029218761", "username":"0d3db427-588f-4716-96e4-6d967ebdd5cb", "password":"N2fvaFBAIbzPiC5k3pJxGN1kt", "host":"60.250.255.134", "port":8086 } } } ] } ``` ## Model API #### [Post] v1/model/train * 說明 : save and train model * Request: ``` { "project_id" : int, "model_id" : string, # unique "name" : string, "template" : string, "dataset" : [ { "object_id" : string }, { "object_id" : string } ] } ``` * Response: ``` # 正確 add model and train { "errCode" : 200, "data" : "success" } # 錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### [Put] v1/model/rename * 說明 : rename model * Request: ``` { "model_id": string, "name": string } ``` * Response: ``` # 正確 rename model { "errCode" : 200, "data" : "success" } # 錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### [Put] v1/model/train * 說明 : edit model * Request: ``` { "model_id" : string, # unique "name" : string, "template" : string, "dataset" : [ { "object_id" : string }, { "object_id" : string } ] } ``` * Response: ``` # 正確 update model and train { "errCode" : 200, "data" : "success" } # 錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### [Post] v1/model/deploy * 說明 : deploy model * Request: ``` { "model_id" : string, # unique "template" : string, "dataset" : [ { "object_id" : string }, { "object_id" : string } ] } ``` * Response: ``` # 正確 deploy model { "errCode" : 200, "data" : "success" } # 錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### [Delete] v1/model/delete * 說明 : delete model * Request: ``` { "models" : [ { "model_id" : string, "template" : string }, { "model_id" : string, "template" : string } ] } ``` * Response: ``` # 正確 delete model { "errCode" : 200, "data" : "success" } # 錯誤 { "errCode" : 600, "data" : string # explain why error happens } ``` #### [Post] v1/model/status * 說明 : model的training status * Request : ``` { "models" : [ { "model_id" : string, "template" : string }, { "model_id" : string, "template" : string } ] } ``` * Response : ``` { "errCode" : 200, "data" : { "models":[ { "model_id" : string, "params": [ { "index": string, "value": float }, { "index": string, "value": float, "predict": []float, # 預測每隔一小時或一天後的資料,按照順序 "freq": string # day or hour } ], "train" : { "training_status" : string, #status : Success、Running、Fail "training_result" : string, "last_training_start_time" : string, "last_training_finish_time": string } }, { "model_id" : string, "params": [], "train" : { "training_status" : string, "training_result" : string, "last_training_start_time" : string, "last_training_finish_time" : string } } ] } } Example: { "errCode" : 200, "data" : { "models":[ { "model_id" : 'test_thermal_comfort', "params": [ { "index": "r2", "value": 0.9982897258187522, }, { "index": "rmse", "value": 0.17305151433941773, } ], "train" : { "training_status" : 'success', "training_result" : '{"r2": 0.9982897258187522, "rmse": 0.17305151433941773}', "last_training_start_time" : 'string', "last_training_finish_time": 'string' } }, { "model_id" : 'test_forecasting', "params": [ { "index": "rmse", "value": 3.252483, # average of 6 value "predict": [2.9695, 3.0125, 3.2181, 3.3828, 3.3414, 3.5906], "freq": 'hour' } ], "train" : { "training_status" : 'success', "training_result" : '{"1hr": 2.9695, "2hr": 3.0125, "3hr": 3.2181, "4hr": 3.3828, "5hr": 3.3414, "6hr": 3.5906}', "last_training_start_time" : 'string', "last_training_finish_time" : 'string' } } ] } } ``` ## Log API #### [Get] v1/log/setting/project_id * Response : ``` { "errCode" : 200, "data" : { "event_type" : []string "scenario": []string } } ``` #### [Post] v1/log/filter * Resuest : ``` { "project_id": int, "filter": { "event_type": []string, "from": int, #從第幾筆開始顯示 "to": int, #到第幾筆結束 "scenario" : string, #template "search_model": string, #search model name "time_range": []string, "order": { "by": string, #time, scenario, event_type or model_name "method": string #排序 : ASC、DSC } } } ``` * Response : ``` { "errCode" : 200, "data" : { "result": [ { "time": timestamp, "scenario": string, "event_type": string, "model_name": string, "event": string } ], "total_count": int } }