PI Web API
Integración con el AVEVA PI System (antes OSIsoft) mediante la PI Web API. Corre en proceso
dentro de cms-api sobre HTTPS — sin SDK nativo, sin microservicio separado y sin dependencia
binaria.
Aunque habla HTTP, no es una integración HTTP genérica: el CMS conoce el vocabulario del PI (tags, ventanas de tiempo, calidad de muestra) y resuelve por su cuenta la parte más tediosa del producto, que es el WebId.
Por qué importa el WebId
Toda lectura y escritura en la PI Web API direcciona la tag por un WebId — un identificador opaco
generado por el servidor que cambia si la tag se borra y se recrea, o si el PI se migra.
Una integración HTTP cruda guardaría ese WebId en la URL de la recolección. El día en que la tag se
recreara, toda la configuración pasaría a devolver 404 sin ninguna pista del motivo, y alguien
tendría que reescribir URL por URL.
En el CMS lo que se configura es la ruta de la tag (\\PISRV01\FIC101.PV) — legible, estable y
exportable. El WebId vive solo en una caché interna; cuando el PI responde que ya no existe, el CMS
vuelve a resolver la ruta por su cuenta y repite la llamada. La configuración no se rompe.
Conexión
Registre el servidor en Conexiones Externas, en la categoría Protocolos Industriales:
- URL Base — puede pegar la raíz del sitio (
https://pi.empresa.com); el sufijo/piwebapise agrega cuando falta. - Autenticación — Basic (usuario y contraseña), Bearer (token) o Anónimo.
- Data Server predeterminado — el botón Buscar servidores lista los PI Data Archives visibles
para la credencial; al hacer clic en el nombre se completa el campo. Con él configurado, las tags
pueden informarse solo por el nombre (
FIC101.PV) en vez de la ruta completa. - Validar certificado TLS — déjelo activado. Si el PI usa un certificado autofirmado o de CA interna, prefiera pegar la CA en Certificado de la CA a desactivar la validación.
El botón Probar Conexión valida en dos etapas — dirección/credencial y luego el Data Server — y rechaza en el acto un nombre de servidor inexistente, en vez de dejar que el error aparezca recién en la primera recolección.
La PI Web API exige el header X-Requested-With como protección anti-CSRF y responde 401 sin
él, incluso con una credencial correcta. El CMS envía siempre el header — es la trampa número 1
de quien integra con PI por primera vez.
Una Aplicación con Keep Alive PI_WEB_API monitorea el servidor en el cockpit. La prueba también
avisa cuando la PI Web API responde pero el Data Archive detrás está desconectado — una situación en
la que ninguna tag puede leerse aunque el HTTP siga devolviendo 200.
Catálogo de tags
El ícono de catálogo en la fila de la conexión abre el navegador de tags: filtra por nombre con
el comodín * del propio PI y muestra descripción, unidad de ingeniería y tipo del punto.
Es cache-first — abre al instante y funciona con el PI fuera de servicio, sirviendo el catálogo ya conocido. El botón Actualizar del PI fuerza la ida al servidor.
El mismo navegador reaparece como selector de tag en las pantallas de Recolección y Entrega: hacer clic en una tag ya la agrega con un alias sugerido.
Recolección — PI_WEB_API
Recolección programada (pull), en el mismo programador de HTTP_GET/SQL_SERVER — sin conexión
persistente —, o bajo demanda, cuando tiene Parámetros de Entrada.
Son cuatro modos de lectura:
| Modo | Qué hace |
|---|---|
| Valor Actual | Lee el valor más reciente de cada tag. Un mensaje por ejecución. |
| Histórico (Recorded) | Lee los valores efectivamente grabados en la ventana — los instantes varían de tag a tag. |
| Interpolado | Valores calculados en intervalos regulares — todas las tags en la misma grilla de tiempo. |
| Resumen (Summary) | Un valor agregado por tag en la ventana (promedio, mínimo, máximo, total…). |
El payload generado es {alias: valor} para cada tag configurada. Con Incluir metadatos, gana un
bloque _meta con timestamp, calidad y unidad por tag.
{
"vazao": 128.4,
"temperatura": 87.2,
"_meta": {
"vazao": { "timestamp": "2026-08-21T14:03:00Z", "boa": true, "unidade": "m3/h" }
}
}En el modo Valor Actual todas las tags se leen en una única llamada (/streamsets/value) —
veinte tags cuestan una petición, no veinte.
Barrido incremental de histórico
Inicio y Fin aceptan la sintaxis de tiempo del PI (* = ahora, *-1h = hace una hora) o una fecha
ISO. También aceptan {{ultimaExecucao}}, el placeholder del CMS:
Inicio: {{ultimaExecucao}} Fin: *Con eso, cada ejecución lee exactamente el histórico todavía no leído — sin repetir ni saltar muestras entre ciclos. Es la forma recomendada de traer histórico continuo del PI a una cola.
Una tag de proceso con un año de histórico puede devolver millones de puntos. El campo Máx. muestras/tag es el techo por ejecución — manténgalo coherente con el intervalo de programación.
Ventana que viene de afuera
Inicio, Fin e Intervalo también pueden venir de quien dispara la recolección. El bloque Parámetros
de Entrada (API) queda justo debajo del modo de lectura, antes de los campos de la ventana: declare
allí los nombres — por ejemplo data_inicio y data_final — y úselos en los campos como
{{data_inicio}} y {{data_final}}.
Inicio: {{data_inicio}} Fin: {{data_final}} Intervalo: {{passo}}Con al menos un parámetro, la recolección sale del programador y pasa a ejecutarse bajo demanda: por la API dinámica de Recolección, por un Disparador o por un agente de IA.
POST /api/collect/PI_DEMO_HIST/PI_DEMO_HIST_LEITURA
{ "data_inicio": "*-8h", "data_final": "*" }Un parámetro que no llegue en la llamada usa su valor por defecto; sin valor por defecto, el
campo cae en el valor del PI — *-1h en Inicio, * en Fin y 1h en Intervalo. Los campos también
aceptan Variables ({{NOMBRE}}), como el resto del CMS.
Asistente de tiempo
Nadie necesita memorizar la sintaxis del PI. El ícono de calendario junto a Inicio, Fin e Intervalo abre un asistente que arma la expresión a partir de elecciones en lenguaje común:
| Elección | Se vuelve |
|---|---|
| Ahora | * |
| 2 horas antes de ahora | *-2h |
| Hoy a las 06:30 | t+6h+30m |
| Ayer, 00:00 | y |
| Lunes más reciente, a las 08:00 | mon+8h |
| Fecha y hora fija | la fecha en ISO, en UTC |
| Desde la última ejecución | {{ultimaExecucao}} |
| Un Parámetro de Entrada o una Variable | {{nombre}} |
| Cada 15 minutos (Intervalo) | 15m |
Arriba quedan los atajos más usados y, cuando la recolección tiene Parámetros de Entrada, un botón para cada uno. Una vista previa muestra la expresión, lo que significa y en qué fecha y hora caería si la recolección se ejecutara ahora. El asistente abre ya posicionado en el valor actual del campo — y sigue siendo posible escribir directamente en el campo cualquier expresión que el PI acepte.
t (hoy) y los días de la semana los calcula el PI en la zona horaria de su servidor; la vista
previa usa la de su navegador. Solo hay diferencia si las dos están en zonas distintas.
Emisión
En los modos con ventana de tiempo, la recolección puede generar un mensaje con la serie entera o un mensaje por muestra. La segunda fue pensada para el modo Interpolado, donde todas las tags comparten los mismos instantes; en Recorded, cada tag tiene sus propios instantes de grabación y la agrupación rara vez junta más de una tag por mensaje.
Calidad y tags obligatorias
Con Solo calidad buena activado (el valor por defecto), las muestras que el propio PI marcó como malas o cuestionables se descartan. Una tag marcada obligatoria cuya única muestra vino mala cuenta como “sin valor” y la recolección falla — en vez de propagar un número en el que el PI no confía.
Probar Lectura
El botón Probar Lectura ejecuta la configuración del formulario, incluso sin guardar. Mientras el PI responde, el botón muestra los segundos que pasan; el resultado abre en una ventana cuando la lectura termina:
- Resumen de la consulta — las tags, el modo de lectura, el período ya resuelto (la expresión que de hecho fue al PI), el intervalo, el tipo de resumen o el techo de muestras, los parámetros usados, cuántos registros llegaron (y cuántos se descartaron por calidad), cuántos mensajes generaría la recolección y cuánto tardó. Una tabla muestra, por tag, la ruta y cuántos valores llegaron.
- Registros — cada valor leído: tag, fecha y hora, valor, unidad y calidad, con el total de filas. La tabla muestra los primeros 500.
- Payload — el JSON exacto que la recolección pondría en la cola (los cinco primeros mensajes).
Si la lectura funcionó pero la recolección rechazaría el resultado — una tag obligatoria sin valor, por ejemplo —, la ventana muestra el error y los registros que devolvió el PI, que es justamente lo que ayuda a entender el porqué.
En la prueba no hay llamada de afuera: cada Parámetro de Entrada usa su valor por defecto, y
{{ultimaExecucao}} vale una hora atrás.
Entrega — PI_WEB_API_WRITE
Escribe valores en tags del PI a partir del payload del mensaje — el camino de vuelta, del ERP/MES al historiador.
El productor del mensaje no conoce ninguna ruta de tag: envía un objeto plano con los alias configurados, y la pantalla muestra el payload modelo listo para copiar.
{ "setpoint": "*" }- Timestamp — Ahora sella el momento del envío; Campo del payload usa un campo del propio mensaje, para cuando el dato fue producido antes de llegar al CMS.
- Modo de escritura —
Replacesobrescribe un valor ya grabado en el mismo instante,Insertescribe aunque exista otro,No Replacesolo escribe cuando no hay nada en ese instante.
Si el timestamp viene de un campo del payload y ese campo está ausente o tiene una fecha inválida, la entrega falla en lugar de sellar la hora actual. En un historiador, un dato con la hora equivocada es peor que un dato ausente: pasa a existir con apariencia de correcto.
Como en la recolección, la escritura va en una sola llamada por lote, y solo se escriben las tags presentes en el payload — una tag ausente no se sobrescribe con nulo. Las tags con un valor predeterminado configurado caen en él cuando el mensaje no las trae.
Probar sin un PI real
La pantalla Simuladores trae una pestaña PI Web API que imita el contrato REST del producto dentro del propio CMS — sin puerto nuevo y sin instalar nada.
- Tags con comportamiento propio (senoide, rampa, onda cuadrada, ruido, fijo) que varían solas en el tiempo y sirven histórico de cualquier ventana.
- La Conexión Externa “PI Simulator (interno)” se crea y se mantiene automáticamente: habilitar el simulador basta para usarlo en una recolección.
- El botón Regenerar WebIds simula tags recreadas en el PI, invalidando de una vez todos los WebId entregados — sirve para comprobar que el CMS vuelve a resolver las rutas por su cuenta, sin editar ninguna recolección.
- El simulador también rechaza peticiones sin el header
X-Requested-With, igual que el PI real. - Entiende las mismas expresiones de tiempo que arma el asistente:
*,t,y, días de la semana, desplazamientos en secuencia (t+6h+30m) y fechas ISO.
Alcance de esta versión
Esta versión direcciona el PI Data Archive (PI Points). El Asset Framework (navegación por Elemento/Atributo) no entró — el campo de dirección ya se llama “ruta” y la caché se indexa por ella, así que el AF cabe después sin migración de datos.
La autenticación integrada de Windows (NTLM/Kerberos) también queda fuera de esta versión; use Basic o Bearer.