📋
Estructura JSON en Firebase Realtime Database
Esta es la estructura exacta que usa la página. El ESP32 debe leer /control
para actuar, y escribe en /sensor y /dispositivo.
📁 /mascotas/{id}
"mascotas": {
"-NxABC123": {
"nombre": "Firulais",
"especie": "perro",
"raza": "Labrador",
"edad": 3,
"peso_kg": 12.5,
"condicion": "normal",
"alimento": "royal_canin",
"dieta": {
"gramos_dia": 240,
"gramos_racion": 80,
"raciones_dia": 3,
"kcal_dia": 888
},
"timestamp": 1717200000000
}
}
📁 /horarios/{id}
"horarios": {
"-NxHOR001": {
"mascota_id": "-NxABC123", // ID de la mascota
"mascota_nombre": "Firulais",
"hora": "08:00",
"gramos": 80, // hasta cuántos gramos dispensar
"nombre": "Desayuno",
"dias": "L,M,X,J,V,S,D",
"activo": true,
"timestamp": 1717200000000
}
}
📁 /control ← La web ESCRIBE aquí · el ESP32 LO LEE
"control": {
"modo": "manual", // "manual" | "automatico"
"dispensar": {
"activo": true, // true = abrir servo
"gramos_objetivo": 80, // detenerse al llegar aquí
"mascota_id": "-NxABC123", // qué mascota se está alimentando
"mascota_nombre": "Firulais",
"tipo": "manual", // "manual" | "automatico"
"timestamp": 1717200000000
}
}
📁 /sensor ← El ESP32 ESCRIBE aquí · la web LO LEE
"sensor": {
"peso": 47.3, // gramos actuales en el plato (HX711)
"deposito": 75 // % de comida restante en el depósito
}
📁 /dispositivo ← El ESP32 ESCRIBE aquí
"dispositivo": {
"online": true,
"servo": "abierto", // "abierto" | "cerrado"
"ultima_act": 1717200000000
}
📁 /historial/{id} ← Ambos escriben aquí
"historial": {
"-NxHIST01": {
"mascota_id": "-NxABC123",
"mascota_nombre": "Firulais",
"gramos": 78.5, // lo que realmente cayó (del sensor)
"gramos_objetivo": 80, // lo que se había pedido
"tipo": "automatico", // "manual" | "automatico"
"fecha": "12/06/2025",
"hora": "08:03",
"timestamp": 1717200000000
}
}