Empieza tu análisis en Pi System con R

Empieza tu análisis en Pi System con R

Si trabajas en una industria que utiliza la suite Pi System de Osisoft para historizar los datos este tutorial es para ti, si no igual leelo, aprederás algo.

Quizas tienes ganas de ir mas allá de analisis con excel, utilizando datos con el datalink, y te haz preguntado como puedes trabajar de una manera más eficiente, utilizar mas datos y poder ver lo que pasa en tu proceso.

Este tutorial sigue los pasos explicados en este post, para mayor puedes consultar el artículo completo.

Requisitos

  1. R 3.4.3+ ( funciona perfecto con la versión 4.0.0 link)

  2. PI Web APi Client R link

Instalación

Una vez instalado R y de preferencia utilizando RStudio como IDE para programar. El primer paso es instalar una herramienta que nos permitirá instalar el paquete de conexión que no se encuentra en CRAN.

  install.packages("devtools")

Luego, levantamos la librería instalada e instalamos el packete PI Web API R desde

library(devtools)
install_github("rbechalany/PI-Web-API-Client-R")

Para probar que funciona:

library(piwebapi)

Con esto funcionando podemos empezar.

Conexión

Previamente deberás de asegurarte que tipo autenticación está definida en los servidores Pi para la conexión con Pi Web APi (bastaría con probar las dos opciones aqui mostradas). Encontré un servicio con autenticación basic que usaremos y con el que podremos hacer algunos experimentos.

library(piwebapi)

useKerberos <- FALSE
username <- "webapiuser"
password <- "!try3.14webapi!"
validateSSL <- TRUE
debug <- TRUE
piWebApiService <- piwebapi$new("https://devdata.osisoft.com/piwebapi", useKerberos, username, password, validateSSL, debug)

Para probar que la conexión funciona correctamente

response1 = piWebApiService$home$get()
response1
## $Links
## $Links$Self
## [1] "https://devdata.osisoft.com/piwebapi/"
## 
## $Links$AssetServers
## [1] "https://devdata.osisoft.com/piwebapi/assetservers"
## 
## $Links$DataServers
## [1] "https://devdata.osisoft.com/piwebapi/dataservers"
## 
## $Links$Search
## [1] "https://devdata.osisoft.com/piwebapi/search"
## 
## $Links$System
## [1] "https://devdata.osisoft.com/piwebapi/system"
## 
## 
## attr(,"className")
## [1] "PILanding"

Los valores obtenidos vienen a ser los mismos si ingresamos directamente a https://devdata.osisoft.com/piwebapi y utilizamos las credenciales mostradas líneas arriba.

Consulta de datos

Los métodos principales de recuperación de datos son Recorded para datos compresos e Interpolated valores y podemos elejir entre consultar uno o varios al mismo tiempo

data <- piWebApiService$data$getRecordedValues(path = "pi:\\\\PISRV1\\BA:TEMP.1",
                                                     startTime = "t-10d", endTime = "t",
                                                    maxCount = 90000,timeZone = "America/Lima")

head(data)
##      value            timestamp unitsAbbreviation good questionable substituted
## 1 19.65877 2020-08-28T05:00:58Z                      1            0           0
## 2 20.23804 2020-08-28T05:01:28Z                      1            0           0
## 3 19.09039 2020-08-28T05:01:58Z                      1            0           0
## 4 19.88308 2020-08-28T05:02:28Z                      1            0           0
## 5 18.94377 2020-08-28T05:02:58Z                      1            0           0
## 6 19.03958 2020-08-28T05:03:28Z                      1            0           0

Para consultar datos interpolados y quedarnos solo con los valores podemos usar

library("dplyr")

paths <-c("pi:\\\\PISRV1\\BA:ACTIVE.1",
          "pi:\\\\PISRV1\\BA:CONC.1",
          "pi:\\\\PISRV1\\BA:LEVEL.1",
          "pi:\\\\PISRV1\\BA:TEMP.1")

data2 <- piWebApiService$data$getMultipleInterpolatedValues(paths = paths, startTime = "t-2d", endTime = "t",
                                                            interval = "1m",timeZone = "America/Lima")%>%
  select("timestamp","value1","value2","value3","value4")

head(data2)
##              timestamp value1   value2   value3   value4
## 1 2020-09-05T05:00:00Z Active 20.80128 39.52166 21.89482
## 2 2020-09-05T05:01:00Z Active 21.83165 38.84865 22.40835
## 3 2020-09-05T05:02:00Z Active 20.49986 38.96337 22.25714
## 4 2020-09-05T05:03:00Z Active 21.69394 39.78484 22.43602
## 5 2020-09-05T05:04:00Z Active 22.88801 39.57635 22.07614
## 6 2020-09-05T05:05:00Z Active 23.15508 39.42623 25.34974

EDA (Exploratory Data Analysis)

Una vez recuperada la data podemos visualizarla y hacer una exploración preliminar, como ver la tendencia de alguna señal en particular

colnames(data2) <- c("TimeStamp","Activate_Reactor","Conc_Reactor_1",
                     "Level_Reactor_1","Temperature_Reactor_1") 

library("ggplot2")

data2 <- data2 %>%
  mutate(Activate_Reactor = ifelse(Activate_Reactor=="Inactive",0,1)) %>%
  mutate(TimeStamp= as.POSIXct(TimeStamp,format="%Y-%m-%dT%H:%M:%OS"))

data2 %>% 
  ggplot()+
  geom_line(aes(x=TimeStamp, y=Temperature_Reactor_1))

O ver los histogramas de todas las variables

library("tidyr")
data2 %>%
  select(-c(TimeStamp))%>%
  gather() %>%
  ggplot(aes(value)) + 
  geom_histogram(bins = 10) + 
  facet_wrap(~key, scales = 'free_x')

Una de mis herramientas favoritas es plotly para ver las tendencias

library("plotly")

data.graph = data2

a <- data.graph %>%
  tidyr::gather(variable, value, -TimeStamp) %>%
  transform(id = as.integer(factor(variable))) %>%
    plot_ly(x = ~TimeStamp, y = ~value, color = ~variable, colors = "Dark2",
          yaxis = ~paste0("y", id)) %>%
  add_lines() %>%
  subplot(nrows = ncol(data.graph)-1, shareX = TRUE)

a %>% layout(legend = list(orientation = 'h'))

Con esto podrias iniciar tu camino por la exploración y analisis de datos, espero te ayude. Si tienes consultas puedes enviarme un email y apenas pueda te constestaré.