You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit ce41a08
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/_config.yml
+3-3Lines changed: 3 additions & 3 deletions
Original file line number
Diff line number
Diff line change
@@ -1,5 +1,5 @@
1
1
title: Tecovolt
2
-
description: Un nodo inteligente que protege tu hogar antes de que llegue el apagón — Qualcomm Sustainable Power Cities · Talent Land 2025
2
+
description: Un nodo inteligente que protege tu hogar antes de que llegue el apagón — Qualcomm Sustainable Power Cities · Genius Arena 2026
3
3
remote_theme: just-the-docs/just-the-docs@v0.10.1
4
4
5
5
url: "https://JocelynVelarde.github.io"
@@ -20,11 +20,11 @@ nav_enabled: true
20
20
back_to_top: true
21
21
back_to_top_text: "Subir"
22
22
23
-
footer_content: '<b>Slop as a Service (SAAS)</b> — Tecovolt · Qualcomm Sustainable Power Cities · Talent Land 2025<br>Bini Vázquez · Diego Pérez Rossi · Jocelyn Velarde Barrón · Armando Mac Beath'
23
+
footer_content: "<b>Slop as a Service (SAAS)</b> — Tecovolt · Qualcomm Sustainable Power Cities · Genius Arena 2026<br>Bini Vázquez · Diego Pérez Rossi · Jocelyn Velarde Barrón · Armando Mac Beath"
Copy file name to clipboardExpand all lines: docs/blog/index.md
+5-2Lines changed: 5 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,9 +1,10 @@
1
1
---
2
2
title: Blog
3
-
nav_order: 11
3
+
nav_order: 12
4
4
---
5
5
6
6
# Blog
7
+
7
8
{: .fs-8 }
8
9
9
10
Actualizaciones y reflexiones del equipo durante el desarrollo de Tecovolt.
@@ -12,6 +13,7 @@ Actualizaciones y reflexiones del equipo durante el desarrollo de Tecovolt.
12
13
---
13
14
14
15
## Por qué construimos Tecovolt
16
+
15
17
**Abril 2025**
16
18
17
19
Cuando CENACE declaró en alerta al Sistema Eléctrico Nacional por tercer día consecutivo en mayo de 2024, no fue una noticia abstracta para nosotros. Fue el momento en que el taller de la familia dejó de funcionar, cuando el refrigerador del negocio de la esquina perdió toda su mercancía, cuando los equipos médicos domiciliarios se apagaron sin aviso.
@@ -27,6 +29,7 @@ Sense Energy y Emporia Vue son productos excelentes para el mercado norteamerica
27
29
### La apuesta técnica
28
30
29
31
Decidimos construir un sistema que:
32
+
30
33
1.**Opera sin internet** — toda la inferencia on-device
31
34
2.**Actúa físicamente** — relay que protege antes del colapso
32
35
3.**Aprende continuamente** — OTA updates vía Foundries.io
@@ -38,4 +41,4 @@ Estamos en Talent Land construyendo el prototipo funcional. Cada dato que captur
PicoScope como validador independiente, script AWG automatizado y argumentos técnicos para el jurado.
12
+
{: .fs-5 .fw-300 }
13
+
14
+
---
15
+
16
+
## Filosofía del demo
17
+
18
+
El PicoScope 2208B MSO **no es un display redundante** — actúa como **validador independiente.** Muestra la waveform física en tiempo real mientras Tecovolt clasifica y actúa el relay. Dos sistemas independientes mostrando el mismo fenómeno fortalece la credibilidad de las detecciones ante el jurado.
19
+
20
+
---
21
+
22
+
## Secuencia AWG automatizada (~60 segundos)
23
+
24
+
El script `tecovolt_demo_awg.py` automatiza el AWG del PicoScope para reproducir la secuencia de fenómenos que activa el relay:
> La escala del AWG (1500 mV) corresponde a la señal de referencia que el ZMPT procesa para generar ~0.115 V RMS en el ADC del Arduino — equivalente a la red normal de 127V en México.
37
+
38
+
El relay actúa en `sag_severo` porque el MPU acumula ≥2 detecciones de esa clase en su historial de 10 ventanas — no en la primera detección aislada.
39
+
40
+
---
41
+
42
+
## Argumento contra overfitting
43
+
44
+
El modelo final tiene **99.3% accuracy en validation set con AUC=1.00.**
45
+
46
+
Puntos de defensa ante el jurado:
47
+
48
+
**1. La curva de entrenamiento no diverge.** Train y validation convergen juntas — evidencia de generalización correcta, no de memorización.
49
+
50
+
**2. Los fenómenos físicos tienen diferencias matemáticas reales y medibles:**
| flicker |~0.1175 V |~idéntico en RMS — separado por THD |
58
+
59
+
**3. El modelo aprendió física, no ruido.** Una diferencia de 164x entre outage y normal no es un artefacto del dataset — es voltaje presente vs voltaje ausente.
60
+
61
+
**4. THD separa lo que RMS no puede.**`flicker` y `normal` tienen el mismo RMS. El modelo los distingue por distorsión armónica (THD 10–20x mayor en flicker) — una propiedad física real de la modulación de amplitud.
|**thd**| Total Harmonic Distortion — feature clave para separar `flicker` de `normal`|
31
47
32
-
### Features extraídas
48
+
{: .note }
33
49
34
-
-**RMS (mV):** Voltaje eficaz de la ventana
35
-
-**Peak-to-peak (mV):** Rango máximo de la señal
36
-
-**Crest factor:** Relación pico/RMS — indicador de distorsión
37
-
-**RMS ripple (mV):** Variabilidad del RMS — detecta flicker
38
-
-**Frecuencia dominante (Hz):** Componente frecuencial principal
50
+
> **¿Por qué THD?**`flicker` y `normal` tienen RMS casi idéntico (~0.1175V). El flicker genera modulación de amplitud que produce armónicos de 2° y 3° grado. En el dataset final: normal THD=0.005–0.015, flicker THD=0.15–0.30 — una diferencia de 10–20x. Sin esta feature el modelo confunde las dos clases.
39
51
40
-
### Dataset
52
+
{: .warning }
41
53
42
-
Datos sintéticos generados con `tecovolt_synth.py`, calibrados con **PicoScope 2208B** usando señales reales de la red eléctrica de Puebla, MX. El AWG del PicoScope permite crear condiciones controladas de cada clase.
54
+
> **Crítico — no normalizar.** El RMS absoluto es la feature más discriminante. Normalizado, outage (0.0018 V) y normal (0.1175 V) se acercan y el modelo pierde su clase más fácil. outage vs normal es una diferencia de 164x — el modelo aprende física, no ruido.
43
55
44
-
### Resultados de entrenamiento
56
+
### Historia de iteraciones
45
57
46
-
| Iteración | Accuracy (float32) | Notas |
47
-
|:----------|:-------------------|:------|
48
-
| 1er entrenamiento | 92.6% | Confusión: `sag_leve` ↔ `normal` en bordes de RMS |
49
-
|**2do entrenamiento**|**94.5%**| +100 ciclos, Flatten layer, dataset ampliado en clases con traslape |
> **Pendiente:** Reentrenamiento con datos reales capturados del ACS712 y ZMPT101B en el Arduino Uno Q.
53
-
54
-
---
55
66
56
-
## Modelo B · Riesgo térmico
67
+
> **Bug crítico resuelto (v2→v4):** el DSP block tenía `fs=6279.8` hardcodeado (sample rate del PicoScope) pero el dataset v2/v3 fue generado a 1000 Hz. Esto rompía el cálculo de RMS ripple y THD completamente. Fix: `fs = 1000.0` hardcodeado, alineado con el parámetro de Edge Impulse.
57
68
58
-
| Parámetro | Valor |
59
-
|:----------|:------|
60
-
|**Tipo**| Clasificador de 3 clases |
61
-
|**Bloque DSP**| Flatten (temperatura cambia lento — sin análisis frecuencial) |
**Features:**`avg_temperature` y `avg_humidity`por ventana de 10 muestras.
71
+
Dataset mixto real + sintético. Datos reales capturados con PicoScope 2208B MSO del ZMPT101B a 6279.8 Hz (submuestreado a 1000 Hz para el modelo). Augmentation ×50 por captura real usando el perfil de ruido real medido (std diff-to-diff). Dataset final: **1440 train / 360 test, 6 clases balanceadas.**
> A diferencia del modelo de voltaje, el modelo de demanda **sí requiere normalización.** Las 3 features (avg, rms, std) están en la misma escala y el modelo necesita aprender proporciones, no valores absolutos.
81
93
82
-
### Dataset base
94
+
### Valores reales medidos (ACS712-30A, dos calentadores ~1900 W)
83
95
84
-
| Clase | Fuente| rawRMS |
85
-
|:------|:-------|:-------|
86
-
|Baja | Datos reales PicoScope | ≈ 0.0 (sin carga)|
|`alta`| 87.60 ± 0.23 | Dos calentadores (~1900 W)|
89
101
90
-
**1er entrenamiento:**Accuracy = 87.5%. Confusión: `media` vs. `alta` (clase media usa rawRMS estimado, no real).
102
+
**Dataset final:**638 train (600 sintéticos anclados a valores reales + 38 reales). Transitorios de arranque descartados (fronteras entre clases).
91
103
92
104
{: .note }
93
-
> **En curso:** Captura real de clase 'media' con ACS712 y carga de ~950 W para mejorar el modelo.
105
+
106
+
> **Insight de diseño:** la corriente (ACS712) **no** debe mezclarse como feature en el modelo de voltaje. Un sag con calentador encendido se ve diferente a un sag sin calentador — la corriente depende de las cargas del usuario, no de la calidad de la red.
Desarrollado por Jocelyn Velarde. Usa datos de temperatura/humedad del BMP280. Separado correctamente en proyecto EI propio porque tiene bloque de procesamiento distinto (Flatten, no DSP custom).
94
121
95
122
---
96
123
97
124
## Custom DSP Blocks
98
125
99
-
A diferencia del flujo estándar de Edge Impulse, Tecovolt implementa **bloques DSP custom** desplegados vía Docker:
126
+
A diferencia del flujo estándar de Edge Impulse, Tecovolt implementa **bloques DSP custom** desplegados vía Docker y expuestos al servidor de EI vía ngrok:
127
+
128
+
**`tecovolt_block` (Voltaje)** — Extrae las 6 features físicas del modelo de voltaje, incluyendo THD. Implementado en Python (`dsp.py`), servido vía HTTP (`dsp-server.py`). Fix aplicado: parámetros JSON con guiones (`scale-axes`) se convierten a underscores antes de pasar como kwargs de Python.
129
+
130
+
**`tecotemp_block` (Temperatura)** — Procesa ventanas de temperatura/humedad del BMP280 con Flatten block.
100
131
101
-
**`tecovolt_block` (Voltaje)** — Extrae las 5 features físicas relevantes para clasificación de anomalías de voltaje. Implementado en Python, empaquetado en Docker y registrado en Edge Impulse Studio como bloque personalizado.
132
+
---
133
+
134
+
## Lógica de predicción compuesta (MPU)
135
+
136
+
El relay no actúa en una sola detección. El MPU acumula un historial de las últimas 10 clasificaciones del MCU y evalúa patrones:
137
+
138
+
```python
139
+
history = deque(maxlen=10)
140
+
141
+
if history.count('sag_leve') >=3: → alerta_amarilla (WhatsApp)
142
+
if history.count('sag_severo') >=2: → alerta_roja → relay_off
143
+
```
102
144
103
-
**`tecotemp_block` (Temperatura)** — Procesa las ventanas de temperatura y humedad del BMP280 con un Flatten block optimizado para señales de baja frecuencia.
145
+
Esta lógica es lo que diferencia Tecovolt de un monitor pasivo: actúa de forma **predictiva** antes del colapso total, desconectando cargas no críticas para proteger el transformador local.
0 commit comments