====== API ====== Mervis SCADA nabízí otevřené REST-like API postavené na JSON a XML formátech dat. Pro kompletní popis API kontaktujte naši [[cs:help:support|technickou podporu]]. ===== Přehled základních API metod ===== ^Function^Description| ^api/v2/get/authenticate|| ^api/checkCredentials [deprecated]|| ^api/logout|| ^api/get/projects|| ^api/get/projectData|| ^api/get/projectByParts|| ^api/get/history [deprecated]|| ^api/get/history/specific|| ^api/set/history|| ^api/get/values|| ^api/get/alarms|| ^api/get/alarmHistory|| ^api/get/eventHistory|| ^api/get/changes|| ^api/set/executeActions|| ^api/set/values|| ^api/set/executeAlarmOps|| ^api/set/projectPriorityRefresh|| ^api/get/schema|| ^api/get/schema/datapoints|| ^api/get/schema/values|| ^api/get/schema/image|| ^/api/v3/get/history|| ===== Příklad ===== ==== api/v2/get/authenticate ==== **Request** * URL: https://scada.mervis.info/api/v2/get/authenticate?format=xml * Method: POST {"data":{"cred":{"n":"demo","p":"demo","pe":0}}} **Response XML** **Response JSON** { "data": { "ChangePwdBefore": null, "ClientType": 2, "Domain": "3c73477a-6c95-4939-b047-7bbf902bcef1", "DomainName": "GlobalDomain", "FullName": "GlobalDomain\\demo", "Login": "demo", "NotifyNearingPwdExpirationIn": null, "Token": "3:ae378e2d-c7ec-4046-aad1-12310f8f72cc", "TokenValidFor": "P1D", "User": "48141739-5d16-4ca3-8ae1-33e27d9eb22e", "Username": "" }, "result": { "code": 0, "codeTxt": null, "dataType": null, "desc": null } } * Získaný token **t** je třeba použít místo dvojice jméno/heslo v následujících API voláních. ==== [Deprecated] api/checkCredentials ==== **Request** * URL: https://scada.mervis.info/api/checkCredentials?format=xml * Method: POST {"cred":{"n":"demo","p":"demo"}} **Response** * Získaný token **t** je třeba použít místo dvojice jméno/heslo v následujících API voláních. ==== api/get/projects ==== **Request** * URL: https://scada.mervis.info/api/get/projects?format=xml * Method: POST Formát reponse je xml a nebo json podle volané url. {"cred": {"t": "2:85be00d3-5875-4dec-a9b4-c98e2ff2acbe" }} **Response XML** **Response JSON** { "ns": { "r": "http://dev.rcware.eu/serialization/references", "n1": "http://dev.rcware.eu/scada/projects", "n2": "http://dev.rcware.eu/scada/schemas", "n3": "http://dev.rcware.eu/scada/notifications", "n4": "http://dev.rcware.eu/projectMetadata", "n5": "http://dev.rcware.eu/loc", "n6": "http://dev.rcware.eu/groups" }, "doc": { "n1:getProjectsResult": { "n1:projects": [ { "n1:project": { "@": { "n1:id": "2a7f1615-42f2-44ef-a643-f1438ed44e2a", "n1:name": "Weather", "n1:domain": "GlobalDomain", "n1:tz": "Europe/Prague", "r:def": "2" }, "n1:mdi": [ { "n1:mi": { "@": { "n2:totalAllowedSchemasCount": 0, "n2:totalSchemasCount": 0, "r:type": "aa8818ce-d47d-41ff-9be5-3de9f34d7ebf" } } }, { "n1:mi": { "@": { "n3:moduleInstantiated": true, "r:type": "073d1b6c-24f5-435a-a5bd-1d54e04b0d06" } } } ] } }, { "n1:project": { "@": { "n1:id": "1b2623be-eaa4-4e29-8596-c66dd85d5643", "n1:name": "SIMPLE_DEMO", "n1:domain": "GlobalDomain", "n1:tz": "Europe/Prague", "r:def": "3" }, "n1:metadata": [ { "n1:metadata": { "@": { "n4:k": "oplog.config", "n4:v": "..." } } }, { "n1:metadata": { "@": { "n4:k": "oplog.enabled", "n4:v": "true" } } }, { "n1:metadata": { "@": { "n4:k": "oplog.engine", "n4:v": "podio" } } } ], "n1:mdi": [ { "n1:mi": { "@": { "n3:moduleInstantiated": true, "r:type": "073d1b6c-24f5-435a-a5bd-1d54e04b0d06", "r:def": "1" } } }, { "n1:mi": { "@": { "n2:totalAllowedSchemasCount": 0, "n2:totalSchemasCount": 0, "r:type": "aa8818ce-d47d-41ff-9be5-3de9f34d7ebf" } } } ] } }, { "n1:project": { "@": { "n1:id": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "n1:name": "PLYNOVA_KOTELNA", "n1:domain": "GlobalDomain", "n1:tz": "Europe/Prague", "r:def": "4" }, "n1:loc": { "n5:gps": { "@": { "n5:lat": 50.091056, "n5:lon": 14.401667 } } }, "n1:metadata": [ { "n1:metadata": { "@": { "n4:k": "oplog.enabled", "n4:v": "true" } } }, { "n1:metadata": { "@": { "n4:k": "oplog.engine", "n4:v": "podio" } } }, { "n1:metadata": { "@": { "n4:k": "oplog.podio.url", "n4:v": "https://podio.com/energocentrumcz/mervis-oplog/apps/operational-log" } } } ], "n1:mdi": [ { "n1:mi": { "@": { "r:ref": "1", "r:type": "073d1b6c-24f5-435a-a5bd-1d54e04b0d06" } } }, { "n1:mi": { "@": { "n2:totalAllowedSchemasCount": 1, "n2:totalSchemasCount": 1, "r:type": "aa8818ce-d47d-41ff-9be5-3de9f34d7ebf" } } } ] } }, { "n1:project": { "@": { "n1:id": "b9ad5380-7d1d-4043-b675-bd406df6003b", "n1:name": "CVUT_HERBERTOV", "n1:domain": "GlobalDomain", "n1:tz": "Europe/Prague", "r:def": "5" }, "n1:loc": { "n5:gps": { "@": { "n5:lat": 48.621247, "n5:lon": 14.350967 } } }, "n1:mdi": [ { "n1:mi": { "@": { "n3:moduleInstantiated": true, "r:type": "073d1b6c-24f5-435a-a5bd-1d54e04b0d06" } } }, { "n1:mi": { "@": { "n2:totalAllowedSchemasCount": 1, "n2:totalSchemasCount": 1, "r:type": "aa8818ce-d47d-41ff-9be5-3de9f34d7ebf" } } } ] } }, { "n1:project": { "@": { "n1:id": "843855a2-21b4-4e84-b74d-ff3901b54e37", "n1:name": "PRVNI_KROKY", "n1:domain": "GlobalDomain", "n1:tz": "Europe/Prague", "r:def": "6" }, "n1:mdi": [ { "n1:mi": { "@": { "n3:moduleInstantiated": true, "r:type": "073d1b6c-24f5-435a-a5bd-1d54e04b0d06" } } }, { "n1:mi": { "@": { "n2:totalAllowedSchemasCount": 6, "n2:totalSchemasCount": 6, "r:type": "aa8818ce-d47d-41ff-9be5-3de9f34d7ebf" } } } ] } } ], "n1:projectGroups": [ { "n1:group": { "@": { "n6:name": "// fixme - flat merge instead of real one!!!" }, "n6:elements": [ { "n6:projectItem": { "n1:project": { "@": { "r:ref": "2" } } } }, { "n6:projectItem": { "n1:project": { "@": { "r:ref": "3" } } } }, { "n6:projectItem": { "n1:project": { "@": { "r:ref": "4" } } } }, { "n6:projectItem": { "n1:project": { "@": { "r:ref": "5" } } } }, { "n6:projectItem": { "n1:project": { "@": { "r:ref": "6" } } } } ] } } ], "@": { "n1:dataVersion": "K3JgNExrzoSBu8JwZ2NDYg==" } } } } ==== api/get/projectByParts ==== **Request** * URL: https://scada.mervis.info/api/get/projectByParts?format=xml * Method: POST { "cred": { "t": "2:85be00d3-5875-4dec-a9b4-c98e2ff2acbe" }, "projId": "1b2623be-eaa4-4e29-8596-c66dd85d5643", "treeId": "Visual tree", "partType": 0, "offset": 0, "count": 2000 } **Response XML**

6

6

-1

1

-10

20

Output 3

true

true

0

0

false

false

Dec Output

Inc Output

true false Output 0

...
**Response JSON** { "ns": { "r": "http://dev.rcware.eu/serialization/references", "n1": "http://dev.rcware.eu/scada/datapoints", "n2": "http://dev.rcware.eu/scada/basic-props", "n3": "http://dev.rcware.eu/scada/legacy-props", "n4": "http://dev.rcware.eu/rt2com" }, "doc": { "n1:getProjectByPartsResult": { "@": { "n1:projId": "1b2623be-eaa4-4e29-8596-c66dd85d5643", "n1:dataVersion": "638854006248661233", "n1:totalCount": 15, "n1:nextOffset": -1 }, "n1:dps": [ { "n1:dp": { "@": { "n1:id": "07d538d9-9f4b-46ca-ba4d-13b13b5302ff", "n1:n": "analog setpoint", "n1:canAct": true, "n1:canAlr": true }, "n1:v": { "n1:props": [ { "n1:p": { "@": { "n1:n": "Source", "n1:u": "°C", "n1:t": "2025-07-16T23:26:36.0742528Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55", "r:def": "1" }, "n2:v": 6.0 } }, { "n1:p": { "@": { "n1:n": "Output", "n1:u": "°C", "n1:t": "2025-07-16T23:26:36.0742528Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": 6.0 } }, { "n1:p": { "@": { "n1:n": "Dec", "n1:u": "°C", "n1:t": "2024-09-11T13:40:30.8120217Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": -1.0 } }, { "n1:p": { "@": { "n1:n": "Inc", "n1:u": "°C", "n1:t": "2024-09-11T13:40:30.8122506Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": 1.0 } }, { "n1:p": { "@": { "n1:n": "Min", "n1:u": "°C", "n1:t": "2024-09-11T13:40:30.8112955Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": -10.0 } }, { "n1:p": { "@": { "n1:n": "Max", "n1:u": "°C", "n1:t": "2024-09-11T13:40:30.8112988Z", "n1:q": "Good", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": 20.0 } }, { "n1:p": { "@": { "n1:n": "StdVis_V1", "n1:t": "2024-09-11T13:40:30.8112085Z", "n1:q": "Good", "r:type": "b0db7bd7-0375-4830-90f2-6d918bac41ee" }, "n2:v": { "n2:props": [ { "n2:p": { "n2:pn": "Output", "n2:props": [ { "n2:p": { "n2:dec": 3, "n2:fs": "", "@": { "r:type": "033dd98a-337f-4908-9866-55961696f646" } } } ] } } ] } } }, { "n1:p": { "@": { "n1:n": "CheckMin", "n1:t": "2024-09-11T13:40:30.8114074Z", "n1:q": "Good", "r:type": "e4c0288b-9d7b-48d8-93be-fa4a0a787a36" }, "n2:v": true } }, { "n1:p": { "@": { "n1:n": "CheckMax", "n1:t": "2024-09-11T13:40:30.811645Z", "n1:q": "Good", "r:type": "e4c0288b-9d7b-48d8-93be-fa4a0a787a36" }, "n2:v": true } }, { "n1:p": { "@": { "n1:n": "LegacyRcAddress_V1", "n1:t": "2024-09-11T13:40:30.8132286Z", "n1:q": "Good", "r:type": "f426f6d7-8dd5-40a3-ac73-dd98e927fd74" }, "n3:v": { "@": { "n3:e": 1, "n3:g": 1, "n3:n": 2, "n3:o": 15 }, "n3:m": [ { "n3:inpm": { "@": { "n3:i": 0, "n3:p": "Source" } } }, { "n3:inpm": { "@": { "n3:i": 15, "n3:p": "Output" } } }, { "n3:inpm": { "@": { "n3:i": 7, "n3:p": "Min" } } }, { "n3:inpm": { "@": { "n3:i": 8, "n3:p": "Max" } } }, { "n3:inpm": { "@": { "n3:i": 5, "n3:p": "Dec" } } }, { "n3:inpm": { "@": { "n3:i": 9, "n3:a": true, "n3:p": "-" } } }, { "n3:inpm": { "@": { "n3:i": 6, "n3:p": "Inc" } } }, { "n3:inpm": { "@": { "n3:i": 10, "n3:a": true, "n3:p": "+" } } }, { "n3:inpm": { "@": { "n3:i": 11, "n3:a": true, "n3:p": "INIT" } } } ] } } }, { "n1:p": { "@": { "n1:n": "Tags_V1", "n1:t": "2019-06-14T12:00:04.9014633Z", "n1:q": "Good", "r:type": "e1b9ddbd-bf76-4c04-9f61-0626d2d774bb" }, "n2:v": { "n1:tags": [ { "n1:t": { "@": { "n1:vt": "String", "n1:k": "pointy_type", "n1:v": "one" } } } ] } } }, { "n1:p": { "@": { "n1:n": "LAlr", "n1:u": "°C", "n1:t": "0001-01-01T00:00:00", "n1:q": "Unknown", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": 0.0 } }, { "n1:p": { "@": { "n1:n": "HAlr", "n1:u": "°C", "n1:t": "0001-01-01T00:00:00", "n1:q": "Unknown", "r:type": "b133774d-21ce-42b6-add3-57c012079c55" }, "n2:v": 0.0 } }, { "n1:p": { "@": { "n1:n": "LAlrAct", "n1:t": "0001-01-01T00:00:00", "n1:q": "Unknown", "r:type": "e4c0288b-9d7b-48d8-93be-fa4a0a787a36" }, "n2:v": false } }, { "n1:p": { "@": { "n1:n": "HAlrAct", "n1:t": "0001-01-01T00:00:00", "n1:q": "Unknown", "r:type": "e4c0288b-9d7b-48d8-93be-fa4a0a787a36" }, "n2:v": false } } ] }, "n1:a": { "n1:props": [ { "n1:p": { "@": { "n1:n": "-", "r:type": "2e0a871a-af8e-4234-8d27-e3145aeb6bd3" }, "n2:diff": "Dec", "n2:target": "Output" } }, { "n1:p": { "@": { "n1:n": "+", "r:type": "2e0a871a-af8e-4234-8d27-e3145aeb6bd3" }, "n2:diff": "Inc", "n2:target": "Output" } }, { "n1:p": { "@": { "n1:n": "INIT", "r:type": "90d4f1b9-c18c-4ce9-9799-d1475d949139" }, "n2:interactive": true, "n2:interactiveTimestamp": false, "n2:target": "Output", "n2:nonInteractiveValue": 0.0 } } ] }, "n1:core": { "@": { "r:type": "ffdebc6e-11fc-4bcb-949d-04c05dabc6d5" } } } } ... ] } } } ==== api/v3/get/history ==== **Request** * URL: /api/v3/get/history?format=json * Method: POST * Umožňuje stahovat historii pro více datových bodů * V ukázkách je vždy za dvěma lomítky uvedený typ property * V sekci credentials lze místo "token" uvést "name" a "password" - použití bez tokenu je ale výkonnostně penalizováno * "seriesParameters" - se uvádí jen pokud chceme rozdílné hodnoty než v "commonSeriesParameters" * "clientReference" - volitelné - pro dodatečnou identifikaci datového bodu klientem * položky "segmenation", "requestState" a "serverState" se vyplňují podle poslední odpovědi serveru. Pro první volání se tyto hodnoty neuvádějí. { "credentials": { "token":"guid" //string }, "request": { "commonSeriesParameters": { "from": "2018-12-01T00:00:00Z", //UTC dateTime "to": "2018-12-01T10:00:00Z"//UTC dateTime }, "series": [ { "seriesParameters": { "from": "2017-11-28T14:26:16.5029619Z",//UTC dateTime "to": "2018-11-28T14:26:16.5029619Z" //UTC dateTime }, "clientReference": "myId2a", //string "provider": { "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", //guid "dataPointId": "2a9c26c9-2ce3-49c4-909d-9ac1143121f1" //guid } } }, { "clientReference": "myId1a", "provider": { "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "dataPointId": "62cf4083-31ed-4bc1-be25-044ba837a9f0" } } } ] }, "dataSpecification": { "limits": { "count": 1000 //int } }, "segmentation": { "requestState": ";;2;;0", //string "serverState": "xyz" //string } } **Response** * Dokud je v odpovědi v sekci "segmentation" uveden "requestState" existují v daném rozsahu další historie. * "requestState" a "serverState" je nutné do dalšího případného dotazu na historii předat. * Values * v - hodnota * ts - začátek platnosti hodnoty * gt - konec platnosti hodnoty * i - interval, pokud je jiný než uvedená hodnota u celé série * Meta * type - typ uložených hodnot - double, string, datetime * unit - jednotky * interval - informace o periodě, v jaké by měly být hodnoty v databázi uloženy. Slouží k identifikaci chybějících záznamů. { "result": { "code": 0, //int "subCode": 0, //int "message": "" //string }, "data": { "count": 3, //int "historyData": [ { "clientReference": "myId2a", //string "provider": { "id": "689e32fa-24a2-448e-9374-6158e6e6cb15", //guid "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", //guid "dataPointId": "2a9c26c9-2ce3-49c4-909d-9ac1143121f1" //guid } }, "meta": { "type": "string", //string "unit": "", //string "interval": "PT3M" //string - ISO8601 Timespan }, "values": [ { "v": "AUT", //string "ts": "2018-11-26T12:22:15.25795Z", //dateTime "gt": "2018-11-26T13:22:15.5784067Z" //dateTime } ] }, { "clientReference": "myId1a", "provider": { "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "dataPointId": "62cf4083-31ed-4bc1-be25-044ba837a9f0" } }, "meta": { "type": "double", "unit": "hod", "interval": "PT3M" }, "values": [ { "v": 12939,//double "ts": "2018-11-30T23:58:15.2394603Z", "gt": "2018-12-01T01:37:15.4869553Z" }, { "v": 12946, "ts": "2018-12-01T09:22:16.2049051Z", "gt": "2018-12-01T10:37:15.4023519Z", "i": "PT4M" } ] } ] }, "segmentation": { "requestState": "xyz", //string "serverState": "xyz" //string } } **Funkční demo** { "credentials": { "name": "demo", "password": "demo" }, "request": { "commonSeriesParameters": { "from": "2018-12-01T00:00:00Z", "to": "2018-12-01T00:11:00Z" }, "series": [ { "clientReference": "myId1", "provider": { "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "dataPointId": "acad79f3-3358-42dd-9b74-98733e63d771" } } }, { "clientReference": "myId2", "provider": { "parameters": { "projectId": "5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "dataPointId": "14cf0dbb-b050-43aa-a6f0-22886c33ed8e" } } } ] }, "dataSpecification": { "limits": { "count": 1000 } } } ==== [Deprecated] api/get/history==== **Request** * URL: /api/get/history?format=xml * Method: POST { "cred":{ "n":"demo", "p":"demo", "pe":0 }, "projId":"5abf8ca0-94ba-48df-8d3c-7ebe87a12fd0", "dpId":"62cf4083-31ed-4bc1-be25-044ba837a9f0", "from":"/Date(1541199600000)/", "to":"/Date(1541496190357)/", "offset":0, "count":5000, "historyState":"" } **Response** 12754 12754 12754 12755 12756 12757 12758 12759 12760 12761 12761 12761 ====api/set/history==== **Request** * URL: /api/set/history?format=xml * Method: POST * Content-Type: text/xml Atribut **i** nastavuje **interval** ([[https://en.wikipedia.org/wiki/ISO_8601#Time_intervals|ISO 8601]]), v jakém by měla být uložena následující hodnota. V **cred** lze použít i ověření pomocí jména a hesla, ale využití **tokenu** nabízí vyšší výkon. Všechny časové údaje jsou očekávány v UTC. 2.7 3.0 2.0 2.3 **Response** * 200 OK ====api/set/executeActions==== * URL: /api/set/executeActions?format=xml * Method: POST * Content-Type: text/xml ===DoubleValue=== **Request** 16 **Response** ===PlanningCalendar=== * v requestu je atribut "val" který odkazuje na index items v definici plánovacího kalendáře * pokud je kalendář číslený místo "val" se musí použít "dval" pro double hodnoty a "ival" pro integer hodnoty **Request** **Response** ====api/get/values==== * URL: /api/get/values?format=xml * Method: POST ===Output property=== Nejvhodnější způsob vyčtení aktuálních hodnot datových bodů (property "Output") z jednoho nebo více projektů. **Request** { "cred": { "t": "xxxxxx" //token }, "propNamesToSerialize": ["Output"], "offset": 0, "count": 1000, "serverState": null, "dps": [{ "projId": "ba1a92f7-f213-4a72-90e4-f7142b50274b", "dpIds": ["e089dde2-a097-4e0d-8012-c8cf3dc62694", "1089dde2-a097-4e0d-8012-c8cf3dc62696"] } ] } **Response**

ON

0

===PlanningCalendar property=== **Request** { "cred": { "t": "xxxxxx" //token }, "propNamesToSerialize": ["PlanningCalendar"], "offset": 0, "count": 1000, "serverState": null, "dps": [{ "projId": "17d3ff08-40c1-41c0-ad6a-bad4489323c7", "dpIds": ["d1243034-0809-444d-a48a-d04d800b4095"] } ] } **Response**