Cómo conectar la telemetría de cualquier pozo — con cualquier levantamiento y cualquier SCADA — a Oilboards, punta a punta: del tag crudo al tablero latiendo. Incluye el circuito de práctica con el pozo virtual y el procedimiento completo para un pozo real.
El Conector de Campo (conector.oilboards.com) es la herramienta con la que un ingeniero conecta un pozo a Oilboards en una sola visita. Guía cinco pasos y produce un conector: un script Python de ~100 líneas que corre en la red del cliente, lee su SCADA y empuja lotes a la nube.
Tres propiedades que se repiten en todo el manual porque son el argumento de venta ante el cliente: el conector solo lee (no existe ruta de comando hacia su red), solo sale (HTTPS 443, cero puertos entrantes) y nada se oculta (el paso 5 muestra en vivo qué se lee, qué se transforma y qué se escribe).
Los tres viven en la plataforma (app.oilboards.com) y sin ellos la telemetría no entra:
pozo-101h). La API solo acepta
telemetría de entidades registradas: un slug desconocido rechaza con
unknown_entity.▲ el renglón verde de la ficha: cópielo tal cual — ese texto exacto es lo que su conector usa como entity
Del lado del campo, para un pozo real: acceso de lectura a la SCADA o al historiador, una máquina con salida HTTPS al puerto 443 y reloj sincronizado por NTP (la API tolera +2 minutos hacia el futuro y 7 días hacia atrás).
El pozo virtual (wellsim.oilboards.com) simula un pozo completo con switch de levantamiento: BEC, bombeo mecánico, PCP, gas lift, bombeo hidráulico y flujo natural. Ensaye el circuito completo con cada uno antes de viajar — seis ensayos, cero sorpresas en campo.
▲ pantalla ilustrativa — el botón ámbar de práctica llena la URL y lee solo
unknown_entity, coteje ahí el
slug exacto.PRES_FONDO, BSW_PCT, PROD_BRUTA… — documentan
lo que la instrumentación no mide. No es obligatorio enviarlo todo.▲ cada renglón muestra su conversión y su veredicto; el slug se copia de la ficha del pozo
El conector aparece completo en pantalla, con el mapeo cargado. Léalo — es el hábito que después repetirá frente al equipo de ciberseguridad del cliente. Descárguelo si va a correrlo fuera del navegador; para la práctica no es necesario.
▲ el código completo se lee en pantalla — el argumento para ciberseguridad OT del cliente
200 OK · accepted: 12 · rejected: 0.▲ el cliente crea, revoca y regenera sus tokens sin llamar a nadie — y aquí mismo cotejan los slugs
▲ lo esperado: accepted 12 · rejected 0 — si hay rechazos, la tabla dice índice, razón y detalle
▲ la pantalla para dejar abierta junto al equipo de seguridad del cliente: nada oculto entre columna y columna
El pozo virtual no solo habla HTTP: expone además un RTU Modbus TCP genuino en
wellsim.oilboards.com:502 — mismo protocolo y puerto que un RTU/PLC real, con
este mapa de registros (holding registers, float32 en 2 registros, big-endian).
Es el ensayo idéntico a llegar a un pozo de campo:
wellsim.oilboards.com,
puerto 502, unit ID 1.PT_CABEZA, 0, float32, 1, kg/cm2
PC_CABEZA, 2, float32, 1, kg/cm2
PRES_LINEA, 4, float32, 1, kg/cm2
PIP_BOMBA, 6, float32, 1, kg/cm2
PDIS_BOMBA, 8, float32, 1, kg/cm2
FREC_VARIADOR, 10, float32, 1, Hz
AMP_MOTOR, 12, float32, 1, A
VOLT_MOTOR, 14, float32, 1, V
FP_MOTOR, 16, float32, 1, adim
TEMP_MOTOR_FONDO, 18, float32, 1, C
AISLAMIENTO, 20, float32, 1, MOhm
VIB_MOTOR, 22, float32, 1, mm/s
pip install requests pymodbus
python3 conector_pozo-101h.py --escanear # lee el RTU y muestra las lecturas
OILBOARDS_TOKEN='...' python3 conector_pozo-101h.py --una-vez--escanear puede pegarse de vuelta en el paso 1 — el mismo
truco del huevo y la gallina que usará en campo (§04).Los valores por Modbus y por HTTP coinciden: es el mismo motor de física del simulador visto por dos protocolos, como un pozo real visto por su RTU y por su historiador.
Hay además un segundo pozo virtual — pozo-demo-02, gas
lift — con su propio RTU en wellsim.oilboards.com:503 (dos pozos =
dos RTUs, como en campo). Su mapa, con la mezcla de unidades típica de un pozo
neumático (presiones locales en kg/cm², inyección ya en MMpcd):
PT_CABEZA, 0, float32, 1, kg/cm2
PC_CABEZA, 2, float32, 1, kg/cm2
PRES_LINEA, 4, float32, 1, kg/cm2
INY_GAS_LIFT, 6, float32, 1, MMpcd
CHOKE_PCT, 8, float32, 1, %
BSW_PCT, 10, float32, 1, %
PROD_BRUTA, 12, float32, 1, bbl
El flujo es idéntico al de práctica; cambian dos cosas: cómo llegan los tags al paso 1, y que el conector corre en una máquina del cliente, no en su navegador.
| Lo que tiene el cliente | Protocolo en la app | Cómo llegan los tags |
|---|---|---|
| Gateway REST / IoT (Kepware IoT Gateway, API propia) | API HTTP/JSON | Lectura en vivo desde el navegador, como el pozo virtual |
| Ignition, Kepware, WinCC, iFIX, Geo SCADA | OPC-UA | Pegue el listado de NodeIds (exportado del servidor o de UaExpert) |
| RTU / PLC con Ethernet | Modbus TCP | Pegue el mapa de registros: tag, dirección, formato, escala, unidad |
| RTU por RS-485 en sitio | Modbus RTU | Igual que TCP + puerto serial y baudios |
| Broker de campo / IoT | MQTT | Liste los tópicos: tag, tópico, unidad |
| AVEVA/Wonderware, PIMS, SQL | Historiador · SQL | Liste los tags como se consultan; ajuste la consulta en el script |
Truco del huevo y la gallina: si nadie tiene el listado de tags a la mano,
genere el conector con 2–3 tags conocidos, córralo en la máquina del cliente con
--escanear y pegue el JSON que imprime de vuelta en el paso 1. La lista
real sale de la propia SCADA.
pip install requests pymodbus # según el protocolo
export OILBOARDS_TOKEN='(del gestor de secretos)'
python3 conector_pozo-101h.py --una-vez
Lo esperado: nada de RECHAZOS: en la salida y el dato visible en la
plataforma segundos después.El botón «Ver unidad systemd» del paso 3 genera el archivo de servicio con estas instrucciones incluidas. En la máquina del conector (Linux):
# 1. Usuario de servicio sin shell y carpeta del conector
sudo useradd -r -s /usr/sbin/nologin oilboards-conector
sudo mkdir -p /opt/oilboards-conector
sudo cp conector_pozo-101h.py /opt/oilboards-conector/
sudo chown -R oilboards-conector: /opt/oilboards-conector
# 2. El token: en un archivo raíz-solo-lectura, jamás en el código
echo 'OILBOARDS_TOKEN=aqui-el-token' | sudo tee /etc/oilboards-conector.env
sudo chmod 600 /etc/oilboards-conector.env
# 3. Instalar y arrancar
sudo cp conector-pozo-101h.service /etc/systemd/system/
sudo systemctl enable --now conector-pozo-101h
# 4. Vigilar (la palabra clave es RECHAZOS:)
journalctl -u conector-pozo-101h -f
El buffer en disco (./buffer) hace el resto: si el enlace se cae, el
conector acumula y al volver reenvía todo con sus timestamps originales — la ventana de
7 días y la idempotencia garantizan que el periodo se rellena íntegro y sin duplicados.
rejected = 0 sostenido durante al menos 48 horas de operación normal.401 de inmediato; reponer con token nuevo sin pérdida (el buffer reenvía).200 por N minutos
(Oilboards además detecta la fuente silenciosa y avisa).La regla de oro: vigilar rejected > 0. Un rechazo sostenido casi
siempre es un tag mal mapeado o una unidad mal declarada — se corrige en minutos si se
ve, contamina en silencio si no.
| Síntoma | Causa probable | Corrección |
|---|---|---|
| 401 invalid_token | Token mal pegado, revocado o ausente | No reintente con el mismo: verifique el secreto o genere uno nuevo en la plataforma |
| unknown_entity | El slug no coincide con el registrado | Copie el slug exacto desde la plataforma (paso 2); registre el pozo si falta |
| unknown_variable | Errata en el mapeo o variable no dada de alta | Revise el paso 2; si la instrumentación mide algo fuera del catálogo, se acuerda el alta con Oilboards (sin costo) |
| out_of_range | Transmisor fallando o unidad mal declarada (kg/cm² leído como psi = error de 14×) | El detail trae valor y rango; corrija la unidad del tag o revise el transmisor |
| unknown_unit | Unidad no convertible a la canónica —
ojo: la puerta NO acepta variantes ASCII de la canónica (C por °C,
MOhm por MΩ) |
Si la unidad ya es la canónica, omita unit (la app y el
script generado lo hacen solos); si es legítima y falta, se agrega la conversión
en la integración |
| timestamp_in_future | Reloj de la máquina adelantado >2 min | Sincronice por NTP (timedatectl set-ntp true) |
| entity_out_of_scope | La fuente está acotada y no incluye esa entidad | Use la fuente correcta o amplíe su alcance desde la plataforma |
| «No se pudo leer la fuente» en el paso 1 | La fuente HTTP no responde o no permite CORS desde el navegador | Verifique la URL; si es una API interna del cliente, use el método de pegado o
--escanear — quien leerá en producción es el script, no el navegador |
| Guardia de física en rojo | Jerarquía BHP > PIP > THP > FLP rota | O el transmisor miente o dos tags están cruzados en el mapeo — cotejar contra el SCADA local |
| El pozo muestra «—» en la plataforma | El conector no está corriendo o no alcanza el 443 | journalctl -u conector-… -f; pruebe salida:
curl -sI https://app.oilboards.com |
Las preguntas que hará su equipo de ciberseguridad OT, con la respuesta corta:
app.oilboards.com. Cero reglas entrantes, cero VPN, cero hardware ajeno.Referencia normativa: Manual de Integración para Clientes — Ingesta de telemetría SCADA, API v1 (rev. agosto 2026). Este manual de campo lo resume para el uso de la herramienta; ante cualquier diferencia, gana el manual del API.