Enseñar a un Arduino Uno a adivinar la ocupación de las habitaciones: ¿puede aprender por sí solo o necesito sacar antes mis datos?
Traducido del English por IA ·
Responsable de instalaciones de un hotel de 90 habitaciones, no soy programador pero he estado trasteando. Tenemos pequeñas placas en 12 habitaciones (Arduino Uno + un ESP-01 para Wi-Fi, un sensor de CO2 SCD40, un PIR) que envían CO2, temperatura y movimiento a Hermetry cada 2 minutos.Un proveedor nos ofreció por mucho dinero «IA en el borde que aprende cuándo están ocupadas las habitaciones». Pensé: ¿no podría entrenar una red neuronal pequeña en el propio Uno para que aprenda por sí misma? A las camareras de pisos les encantaría saber qué habitaciones están realmente vacías. ¿Es una locura? ¿Por dónde empiezo?
Facility manager at a 90-room hotel, I’m not a programmer but I’ve been tinkering. We have small boards in 12 rooms (Arduino Uno + an ESP-01 for Wi-Fi, SCD40 CO2 sensor, a PIR) sending CO2, temperature and motion to Hermetry every 2 minutes.
A vendor pitched us «AI on the edge that learns when rooms are occupied» for a lot of money. I thought, could I just train a small neural network on the Uno itself so it learns by itself? Housekeeping would love to know which rooms are really empty. Is this crazy? Where would I even start?
Traducido del English por IA ·
Entrenar en un Uno: una locura, sí. 2 KB de RAM. Ejecutar un modelo pequeño entrenado en otro lugar: totalmente viable.
Training on an Uno: crazy, yes. 2 KB of RAM. Running a tiny model that was trained somewhere else: very doable.
Traducido del English por IA ·
¿Por qué el entrenamiento es mucho peor que la ejecución? ¿No son las mismas matemáticas?
Why is training so much worse than running it? Isn’t it the same maths?
Traducido del English por IA ·
El entrenamiento necesita todos los pesos, sus gradientes y una gran cantidad de datos de ejemplo en memoria a la vez, durante muchas pasadas. La inferencia es una sola pasada, multiplicar y sumar, y los pesos pueden estar en la memoria flash.
Training needs every weight, its gradient and a pile of example data in memory at once, many passes. Inference is one pass, multiply and add, and the weights can sit in flash.
Traducido del English por IA ·
Así que el verdadero primer paso es un conjunto de datos. Ya tienes semanas de lecturas en Hermetry, solo te faltan las etiquetas: los horarios de entrada y salida que registra limpieza bastarían.
So the real first step is a dataset. You already have weeks of readings in Hermetry, you just need labels: housekeeping’s check-in/check-out times would do.
Traducido del English por IA ·
Megan tiene razón. Lo que haría:1. Sigue enviando co2, temperature y motion como números (motion como 0/1, no true/false, para que tenga un historial).2. Extrae los datos sin procesar con la API de historial; un día por llamada es cómodo:
curl -s -H "Authorization: Bearer $KEY" "https://$HOST/tenant/$TENANT/api/telemetry/series?kind=iot_device&entityId=$ROOM&keys=co2,temperature,motion&from=$FROM&to=$TO&bucket=raw"
Si una clave devuelve 10.000 puntos, vuelve a pedir desde el último ts + 1.3. Únelo con la exportación de recepción en un portátil y entrena una regresión logística o una red de 3 entradas y 8 neuronas en Python. Eso basta de sobra para la pendiente de CO2 + el recuento de movimiento.4. Cuantiza los pesos a int8, pégalos como un array const int8_t w[] PROGMEM y el Uno solo ejecuta el forward pass. Envía el resultado como occupied_p (0-100) junto con las otras claves.Sinceramente, para la ocupación, el aumento de CO2 en 20 minutos más «cualquier movimiento en los últimos 30 min» te lleva ya bastante lejos antes de cualquier red neuronal. Empieza con eso como línea base para saber si el modelo merece la pena. El lado de la API está aquí: La API de historial.
Megan’s right. What I’d do:
1. Keep sending co2, temperature and motion as numbers (motion as 0/1, not true/false, so it has a history).
2. Pull the raw data out with the history API, one day per call is comfortable:
curl -s -H "Authorization: Bearer $KEY" "https://$HOST/tenant/$TENANT/api/telemetry/series?kind=iot_device&entityId=$ROOM&keys=co2,temperature,motion&from=$FROM&to=$TO&bucket=raw"
If a key comes back with 10,000 points, ask again from the last ts + 1.
3. Join it with the front desk export on a laptop, train a logistic regression or a 3-input, 8-neuron net in Python. That is plenty for CO2 slope + motion count.
4. Quantise the weights to int8, paste them as a const int8_t w[] PROGMEM array, and the Uno only runs the forward pass. Send the result as occupied_p (0-100) alongside the other keys.
Honestly, for occupancy the CO2 rise over 20 minutes plus «any motion in the last 30 min» gets you most of the way before any neural net. Start with that as a baseline so you know if the model is worth it. API side is here: The history API.
Traducido del English por IA ·
Si automatiza esa exportación con un script, asigne a la clave de API el preajuste Solo lectura y restrínjala a la red de su portátil. He visto demasiadas claves con control total en cuadernos de Python.
If you script that export, give the API key the Read-only preset and restrict it to your laptop’s network. Seen too many full-admin keys in Python notebooks.
Traducido del English por IA ·
Actualización tras dos semanas: mi sobrino me ayudó con la parte de Python. La regla simple (CO2 en aumento + movimiento en los últimos 30 min) acertó el 87 % de las veces frente al registro de recepción, y el modelo pequeño el 91 %. Funciona en el Uno, 24 pesos. No vamos a comprar la solución del proveedor. Y sí, creé una clave de solo lectura como dijo Brian; la primera que hice era una clave de administrador…
Update after two weeks: my nephew helped with the Python part. The simple rule (CO2 rising + motion in last 30 min) was right 87% of the time against the front desk log, the tiny model 91%. It runs on the Uno, 24 weights. We’re not buying the vendor thing. And yes, I made a Read-only key like Brian said, my first one was an admin key…
- Debes estar registrado para responder a este debate.
Únete a la conversación
Inicia sesión para preguntar y responder, dar me gusta a las publicaciones útiles y marcar la respuesta que resolvió tu problema. Cada aportación suma puntos y niveles.

