Gateway de borde para sistemas de almacenamiento (BESS): lee telemetría por Modbus TCP, evalúa una envolvente de
seguridad fail-closed, calcula la respuesta en frecuencia (droop/FFR) y el control de reactivos (Volt/VAR) y escribe
consignas P/Q verificadas al PCS. Español: este README; parámetros y convenciones en docs/spec/CONTROL.md.
Estado honesto. Probado contra emuladores y un servidor Modbus independiente. Pendiente de homologación en banco físico con PCS real (criterio formal: protocolo de 72 horas continuas con inversor comercial Huawei SUN2000 o SMA Tripower cumpliendo FFR <500 ms y cero disparos espurios en envolvente). Ver
PROJECT_STATUS.md.
pip install . # o: pip install -e ".[dev]"
open-bess-edge simulate # planta simulada + Modbus TCP + nodo (contingencia 49,65 Hz)
open-bess-edge check-config config/edge_config.yaml
open-bess-edge run --config config/edge_config.yaml
open-bess-edge profile-info open_bess_edge_reference
open-bess-edge verify-audit /var/lib/open-bess-edge/audit.jsonlP + = descarga/inyección, − = carga. Q + = capacitivo (sube tensión). La conversión desde la convención de cada
fabricante se hace sólo en el perfil (sign, factor).
lectura → envolvente de seguridad → FFR/droop → Volt/VAR → limitador → escritura (+verificación) → latido → auditoría
Garantías, cada una con test (tests/test_node.py, tests/test_fuzz_invariants.py):
- Arranque en 0 kW y validación de
startup_valid_cyclesciclos antes de operar. - Pérdida de telemetría: retiene la consigna
comm_loss_hold_s(2 s) y luego fuerza 0, reintentando el 0 hasta confirmarlo. Un PCS sin watchdog conserva la última consigna mientras el enlace esté caído: usar el registro de latido. - Dato requerido ausente, NaN, infinito o físicamente imposible ⇒ salida 0 (nunca un valor "razonable").
- Disparos de seguridad enclavados; se liberan sólo con reset explícito y condición despejada con histéresis.
- Consigna con truncado hacia cero; desborde de registro ⇒ error, nunca wrap-around.
- Errores internos no matan el lazo: estado
SAFE_STATEy auditoría.
| Código | Efecto |
|---|---|
| BESS-GUARD-001 / 002 | Sub/sobretensión de celda: disparo enclavado |
| BESS-GUARD-003 | Sobretemperatura de celda: disparo enclavado |
| BESS-GUARD-004 | Aislamiento DC: disparo enclavado |
| BESS-GUARD-005 | Desbalance de celdas: advertencia |
| BESS-GUARD-006 / 009 | Temperatura de celda / ambiente altas: recorte 50 % |
| BESS-GUARD-007 | Temperatura baja: inhibe carga |
| BESS-GUARD-008 | Tensión de string fuera de ventana: disparo enclavado |
| BESS-GUARD-010 | SOC en límite: inhibe descarga o carga |
| BESS-GUARD-020 / 021 | Alarma de frecuencia / tensión de red (sólo si se configuran umbrales) |
| BESS-GUARD-090 | Dato requerido inválido: salida 0, se recupera tras N ciclos válidos |
| BESS-GUARD-091 | Medidor de red (PCC) sin datos vigentes: salida 0, se recupera tras N ciclos válidos |
Un perfil sólo permite control si declara consigna de P y las señales de seguridad requeridas. Ningún perfil de
fabricante lo hace hoy: son de monitor y su nivel es unverified (bindings derivados de las descripciones del perfil,
sin prueba contra el equipo real).
| Perfil | Modo | Nivel |
|---|---|---|
open_bess_edge_reference |
control | reference (mapa definido por el proyecto) |
huawei_sun2000 |
monitor | unverified |
sma_sunny_tripower |
monitor | unverified |
fronius_gen24_byd |
monitor | unverified |
solaredge_storedge |
monitor | unverified |
victron_multiplus2 |
monitor | unverified |
open_bess_edge_meter_reference |
monitor | reference (medidor de red del PCC; mapa del proyecto) |
installation declara restricciones genéricas (max_grid_import_kw, max_grid_export_kw, soc_reserve_pct) que el edge
hace cumplir con la medición de un medidor en el PCC (grid_meter); si el medidor falla, la salida queda en 0 (BESS-GUARD-091).
El estado del conjunto de reglas (VIGENTE/EN_EVALUACION/SUPUESTO) se audita y se expone en /status; si no es VIGENTE
el nodo exige accept_unverified_rule_set: true. Un EMS local envía un programa base con expiración por HTTP autenticado
(sólo loopback, sin TLS). Ejemplo: config/installation_btm_peak_shaving.yaml; decisiones y límites: docs/spec/INSTALLATION.md.
make check ejecuta lint, mypy estricto, pruebas, verificador de afirmaciones y seguridad. Cubre pruebas unitarias y de
propiedades, extremo a extremo por TCP real con inyección de fallas, fuzz de invariantes y latencia en tiempo real
(loopback, sin PCS). Compatible con pymodbus ≥ 3.9.2 (3.9.2 a 3.15.0 probadas; 3.8.x acepta respuestas con transaction
ID incorrecto y se excluye).
CAN/DBC (validado contra cantools), IEC 60870-5-104 (interopera en STARTDT e interrogación con c104; sin
temporizadores t1/t2/t3) y un códec tipo GOOSE sobre UDP de loopback (no es GOOSE de capa 2). No se afirma latencia.