Marcos Vainer Loeff

Announcing PI Web API client library for MATLAB Toolbox

Blog Post created by Marcos Vainer Loeff Employee on Jun 4, 2018



This is a MATLAB toolbox that integrates the PI System with MATLAB through PI Web API. With this toolbox you can retrieve PI data without having to generate the URL for each request. This version was developed on top of the PI Web API 2018 Swagger specification.


In the new upcoming 2018 release, PI Asset Analytics will introduce native connectivity to MATLAB enabling users to schedule and run their MATLAB functions fully integrated into their analyses. In other words, you will be able to integrate the PI System with MATLAB on production using a model that you have already built. This tool was developed for you to create new models with PI System data before using it on production.


Finally, this client library is read-only since only the HTTP GET request methods were added to the library.




  • PI Web API 2018 installed within your domain using Kerberos or Basic Authentication. If you are using an older version, some methods might not work.
  • MATLAB 2018a+


GitHub repository


Please visit the GitHub repository for this project where you can find its source code, download the toolbox and read about the new features added.




This MATLAB toolbox is not available on MATLAB central servers. You should download it directly from this GitHub repository on the release section.


Please use the command below to install the toolbox:




If the installation is successful, you should see this toolbox inside matlab.addons.toolbox.installedToolboxes:


toolboxes = matlab.addons.toolbox.installedToolboxes;


If you want to uninstall this toolbox, use the command below:






All the methods and classes from this MATLAB Toolbox are described on its documentation, which can be opened by typing on the console:


demo toolbox 'PI Web API client library for Matlab'




It is highly recommended to turn debug mode on in case you are using PI Web API 2017 R2+ in order to receive more detailed exception errors. This can be achieved by creating or editing the DebugMode attribute's value to TRUE from the System Configuration element.




Please refer to the following examples to understand how to use this library:


Create an instance of the piwebapi top level object using Basic authentication.


username = 'webapiuser';
useKerberos = false;
password = 'password'
baseUrl = '';
verifySsl = false;
client = piwebapi(baseUrl, useKerberos, username, password, verifySsl);


Only the Basic authentication is available on this initial version. Please make sure to set up PI Web API properly to make it compatible with this authentication method.

If you are having issues with your SSL certificate and you want to ignore this error, set verifySsl to false.


Retrieve data from the home PI Web API endpoint


pilanding = client.home.get();


Get the PI Data Archive object


dataServer = client.dataServer.getByName(serverName);


Get the PI Point, AF Element and AF Attribute objects


point = client.point.getByPath("\\PISRV1\sinusoid");
attribute = client.attribute.getByPath("\\PISRV1\Universities\UC Davis\Buildings\Academic Surge Building\Electricity|Demand");
element = client.element.getByPath("\\PISRV1\Universities\UC Davis\Buildings\Academic Surge Building\Electricity"); 


Get recorded, interpolated and plot values from a stream


webId = point1.WebId;
startTime = "*-10d";
endTime = "*";
interval = "1h";
intervals = 30;
maxCount = 100;
desiredUnits = '';
selectedFields = '';
associations = '';
boundaryType = '';
filterExpression = '';
includeFilteredValues = '';

recordedValues =, associations, boundaryType, desiredUnits, endTime, filterExpression, includeFilteredValues, maxCount, selectedFields, startTime);
interpolatedValues =, desiredUnits, endTime, filterExpression, includeFilteredValues, interval, selectedFields, startTime);
plotValues =, desiredUnits, endTime, intervals, selectedFields, startTime);


Get recorded, interpolated and plot values from a streamset in bulk


sortField = '';
sortOrder= '';

webIds = { point1.WebId, point2.WebId, point3.WebId, attribute.WebId};

recordedValuesInBulk = client.streamSet.getRecordedAdHoc(webIds, boundaryType, endTime, filterExpression, includeFilteredValues, maxCount, selectedFields, sortField, sortOrder, startTime);
interpolatedValuesInBulk = client.streamSet.getInterpolatedAdHoc(webIds, endTime, filterExpression, includeFilteredValues, interval, selectedFields, sortField, sortOrder, startTime);
plotValuesInBulk = client.streamSet.getPlotAdHoc(webIds, endTime, intervals, selectedFields, sortField, sortOrder, startTime);





If you want to create models to be used in production, please use this library and let me know if it works fine. You can send me an e-mail directly ( or leave a comment below.