Automatización del Hogar con Raspberry Pi 2 y Windows 10 IoT Core: Guía Completa de Componentes
Componentes y materiales
| Raspberry Pi 2 Model B | × | 1 |
| Placa de relés HSRel5 (5 relés, 3 GPIO, I²C, PCF8574) | × | 1 |
| Placa de relés HSRel8(+8) (8 relés, 8 GPIO, I²C, MAX7311) | × | 1 |
| Expansor de puertos I²C 16 bits (MAX7311) | × | 1 |
| Fuente conmutada 12V/54W (carril DIN) | × | 1 |
| Fuente conmutada 5V/3A (carril DIN, MeanWell DR-30-5) | × | 1 |
| Shield de prototipado para Raspberry Pi | × | 1 |
| Buffer I²C / convertidor de nivel (P82B96) | × | 1 |
| Arduino Nano R3 (puente sensores DHT22 ↔ bus I²C) | × | 1 |
| Emisor/receptor 433 MHz (para relés inalámbricos) | × | 1 |
Aplicaciones y servicios en línea
- Microsoft Visual Studio 2015
- Arduino IDE
Sobre el proyecto
Actualización 2: El proyecto sigue creciendo con nuevas funciones (cliente Twitter, bots de Telegram). Consulta el repositorio GitHub y las notas de versión para más detalles.
Actualización 1: Gracias a todos por los comentarios. Presentado en Maker Faire Rome 2015 y Microsoft Technical Summit 2015.
Desarrollo una solución de domótica desde hace 3 años: instalación física de hardware y desarrollo de software.
Características
Entradas (Sensores)
- Pulsador (Busch-Jaeger 2020US)
- Detector de movimiento (Abus 360° BW8085)
- Temperatura ambiente (dispositivo propio con DHT22)
- Humedad ambiente (dispositivo propio con DHT22)
- Estado de ventanas (abierto/cerrado, contacto reed Honeywell Slimline)
- Amanecer, atardecer, temperatura y humedad exterior (OpenWeatherMap)
Salidas (Actuadores)
- Lámpara (techo) – relé, sin dimmer
- Enchufe – relé, sin dimmer
- Persiana enrollable – 2 relés (subir/bajar)
- Ventilador techo – 3 relés (velocidades)
- Extractor baño – 2 relés (velocidades)
Otras funciones
- Web App multiplataforma (iOS, Android, Windows, macOS) para control remoto. Configuración cargada desde el controlador (Windows IoT).
- Eventos de entradas/salidas publicados en Microsoft Azure Event Hub y/o registrados en CSV.
- Trazas UDP detalladas desde el controlador para depuración.
- Actuadores personalizables para más hardware.
- Combinación de salidas físicas en salidas lógicas.
- Animaciones en salidas lógicas.
- Diseño tolerante a fallos: si fallan placas en una zona, el resto sigue funcionando.
- Soporte para relés remotos 433 MHz.
El concepto
Al reformar la vivienda, decidí controlar todo desde el cuadro eléctrico usando relés. Cada pulsador, lámpara, enchufe, persiana, etc., tiene su propio cable hasta el cuadro. No se necesita bus KNX/EIB.
Nota: Vivo en Alemania, todos los componentes son para 230V. Otras tensiones requieren adaptaciones. La instalación de cables 230V y cuadros la realiza un electricista certificado.
Hardware
El nuevo cuadro eléctrico
Se instaló un cuadro nuevo que gestiona las dos plantas de la casa.
El bus I²C optimizado
El bus I²C no está diseñado para cables largos, pero se puede extender con estos trucos:
- Alimentar el bus a 5V. La Raspberry Pi usa 3.3V → se necesita convertidor de nivel I²C (P82B96). Es el primer dispositivo conectado a la Pi; el cable debe ser lo más corto posible.
- Usar cable de par trenzado (CAT7): un par para SDA+GND, otro para SCL+GND. No usar un solo par para SDA+SCL. Conectar la malla a PE (tierra de protección).
- Preferir cable flexible (multihilo) para mayor longitud.
- Añadir resistencias pull-up de 10k al final del bus en SDA y SCL.
- Limitar velocidad a 100 kbit/s (Standard Mode).
- Incluir buffer I²C (P82B96) a mitad del bus para segmentar y regenerar la señal.
Este bus I²C optimizado conecta todas las placas dentro del cuadro.
Placas de relés (salidas)
CCTools (Alemania) vende placas con relés para bus I²C. También venden kits o solo el PCB. Esto permite reemplazar el expansor por alternativas pin-compatibles (importante por direcciones I²C limitadas). Se usan zócalos para relés e ICs para fácil sustitución. Se puede usar PCA9555D en lugar de MAX7311 (más barato y fácil de conseguir en Alemania).
La placa HSRel5 tiene 5 relés y 3 GPIOs extra, controlados por un PCF8574 (8 bits). Los primeros 5 bits mandan los relés; los 3 restantes son salidas libres. Los relés necesitan 12V, que el expansor no puede dar (solo LED). Se usa driver de relés (ULN2803) y un inversor, porque al encender el PCF8574 todos sus pines están en HIGH, lo que cerraría todos los relés (comportamiento no deseado).
Conclusión: Para cerrar el primer relé, se envía 00011110 (MSB) al expansor. El primer pin va a inversor, luego a driver, luego al relé.
La placa HSRel8(+8) usa MAX7311 y tiene 8 relés + 8 GPIOs. No necesita inversor hardware: HIGH = ON. Esta diferencia la gestiona el driver software.
Actualmente uso 8 HSRel5 y 4 HSRel8. El PCF8574 permite 8 direcciones; el PCF8574A otras 8 distintas → hasta 16 HSRel5 en el bus.
Expansores de puertos (entradas)
Pulsadores, detectores de movimiento y contactos reed van a la placa I2C-Port16 HS (CCTools). Contiene MAX7311, pull-ups 5V/10k en cada puerto y condensadores cerámicos 100 nF (filtro anti-ruido). Funciona con 12V o 5V.
Cada dispositivo de entrada tiene su propio cable CAT7 (con malla a PE) hasta el cuadro. Puntos con varios pulsadores (ej. persianas) usan un solo CAT7.
En el cuadro, cada entrada va a un puerto del expansor y a GND. Por pull-ups, el estado por defecto es HIGH. Pulsar conecta a GND → LOW. Detectores y reeds funcionan igual.
Un cable de interrupción compartido va a todas las placas de entrada. Por defecto está en HIGH (pull-up). Cuando un expansor detecta cambio, pone la interrupción a LOW. El software en la Pi2 solo sondea el GPIO de interrupción; si cambia, sondea las placas correspondientes y genera eventos. Evita sondeo continuo de todo el bus I²C.
Raspberry Pi 2
Corre Windows 10 IoT, montada en caja personalizada en el cuadro. Tiene shield de prototipado con LED de estado, puerto de interrupción con pull-up 10k, resistencia de protección 1k y condensador 100 nF (filtro). Conexiones por bornes de tornillo.
Sensor temperatura y humedad
10 sensores DHT22 (AOSONG) miden temp/humedad por habitación. Usan protocolo propietario sin direccionamiento → cada sensor necesita su microcontrolador. Se usa un Arduino Nano V3.0 como esclavo en el bus I²C. Lee todos los sensores cada 2.5 s y cachea valores. La Pi2 lee enviando el ID del puerto (0-10), igual que leer registros I²C.
La Web App muestra temp/humedad en dos vistas. Icono en humedad indica riesgo de moho: <60% verde, <70% amarillo, ≥70% rojo. También hay vista resumen de todos los sensores.
Montaje hardware en el cuadro
Relés remotos 433 MHz
Se desarrolló emisor 433 MHz oculto en la caja del sensor temp/humedad de una habitación central. El Arduino Nano (puente DHT22) también envía señales 433 MHz. Emisor FS1000A alimentado a 12V para mayor alcance (también funciona a 3.3V pero corto alcance).
Problema: los relés remotos no reportan estado. El usuario puede cambiar estado con el mando original. Para forzar sincronía, el software actualiza el estado cada 5 s. Los relés remotos funcionan igual que los de placa en automatizaciones.
Los códigos 433 MHz se configuran manualmente con un circuito en protoboard (sketch Fritzing y código Arduino en repo: CK.HomeAutomation.SensorsBridge\RemoteCodeFinder).
Caja de arena digital para gato
La caja está en trastero sin ventilación. Conectada a chimenea en desuso con ventilador en relé del cuadro. Detector de movimiento en trastero activa ventilador unos minutos al detectar al gato.
Icono propio en Web App para controlar ventilador manualmente. Analizando logs (Azure SQL o CSV) se rastrea uso de la caja y optimiza limpieza.
Software
Antes de Windows 10 IoT, corría en G120 (GHI Electronics) con .NET Micro Framework 4.3. Falta de rendimiento (120 MHz, 16 MB RAM, interpretado) limitaba funciones.
Hace semanas migré a Windows 10 IoT Background Task, añadiendo integración Azure. El repositorio (GitHub) contiene la solución Visual Studio 2015 completa: SDK, Web App y configuración personal. Permite usar Raspberry Pi 2 como controlador domótico, extensible con drivers propios.
Proyectos de la solución
- App: Web App (AngularJS, jQuery, Bootstrap).
- Controllers: Proyectos de arranque (IoT Background Task) y configuración del hogar.
- SDK: Proyectos compartidos.
CK.HomeAutomation.TraceViewer
Aplicación de consola que muestra trazas UDP del controlador (Pi2). Requiere abrir puerto (ej. 19227) en firewall. Útil para depuración.
CK.HomeAutomation.Networking
Servidor HTTP básico para Web App: sirve JSON de estado y acepta cambios. También hospeda la Web App (archivos deben subirse manualmente vía SMB admin a \\\[IP\]\c$\Users\DefaultAccount\AppData\Local\Packages\CK.HomeAutomation.Controller-uwp_p2wxv0ry6mv8g\LocalState\app).
CK.HomeAutomation.Controller.*
Cada proyecto en Controllers es un startup project implementando IoT Background Task. El proyecto CK.HomeAutomation.Controller.Empty sirve de plantilla. El controlador Cellar (jardín/aparcamiento) no está documentado aquí.
Requisitos previos:
- Configurar Raspberry Pi 2 con Windows 10 IoT desde cero.
- Conectar por PowerShell remoto.
- Desplegar app universal (UWP) en la Pi2.
Script SetupRaspberryPi.ps1 automatiza comandos comunes (ajustar IPs a tu infraestructura).
CK.HomeAutomation.Actuators
Capa de abstracción más alta: hogar, habitaciones, actuadores (pulsadores, lámparas, enchufes, etc.) con eventos y métodos específicos. Configuración fluida (fluent API) legible.
Actuador MotionDetector
Detecta personas/movimiento (Abus BW8085 360° en techo). Dos eventos: MotionDetected (inicio) y DetectionCompleted (fin, cuando cesa movimiento). En Web App se puede desactivar por software; punto rojo = movimiento actual.
Actuador Button
Pulsador físico. Dos eventos: PressedShort (<1.5 s) y PressedLong (>1.5 s, o si supera 1.5 s sin soltar). Permite múltiples funciones por botón. Existe VirtualButton (interfaz IButton) pulsable solo desde Web App.
Actuadores Socket, Lamp, BinaryStateOutput
Clase base BinaryStateOutput para estados binarios ON/OFF. Métodos para actualizar/alternar estado. Los Buttons interactúan con objetos que implementan IBinaryStateOutputActuator. Iconos personalizables vía Configuration.js.
CombinedBinaryStateActuators
Varios actuadores físicos binarios combinados en uno lógico. Uno es "master" para determinar estado al alternar. Evita retrasos visibles al actualizar varios relés secuencialmente por I²C, usando seguimiento interno de cambios.
StateMachine (máquina de estados)
Estados complejos más allá de ON/OFF. Ej.: ventilador con 3 velocidades + OFF. Métodos: apagar o avanzar al siguiente estado; al llegar al último y volver a activar, vuelve a OFF. También sirve para "ambientes" (moods): grupo de actuadores con estados predefinidos. Método WithTurnOffIfStateIsAppliedTwice apaga si se pulsa dos veces el mismo trigger.
TemperatureSensor / HumiditySensor
Valores leídos vía puente I²C (Arduino Nano). Separados en dos actuadores. Sondeo automático cada 10 s.
Automatización ≠ Control remoto
Lo importante es la automatización. Sin ella, es solo un mando a distancia grande. El sistema incluye:
AutomaticTurnOnAndOffAutomation
Enciende salidas binarias por tiempo definido. Trigger: pulsador o detector. Duración ON configurable. Rango horario opcional (solo día/noche, requiere estación meteorológica).
AutomaticRollerShutterAutomation
Persianas automáticas según: amanecer/atardecer (suben/bajan), temperatura exterior (cierran si >28°C, para ventanas de tejado), hora "no abrir antes de". Posición rastreada por tiempo (configurar duración subida/bajada).
AutomaticConditionalOnAutomation
Enciende salidas mientras se cumplen condiciones. Ej.: luces jardín solo de noche. Rangos ON/OFF múltiples, amanecer/atardecer para ON.
Automatización genérica y condiciones complejas
Marco genérico: ejecuta acciones personalizadas si se cumplen condiciones al invocarse triggers (pulsador, detector, intervalo, código).
Estación meteorológica virtual
Datos cada 60 s de OpenWeatherMap (clima, amanecer/atardecer, temp/humedad exterior). Interfaz IWeatherStation para integrar estación física futura.
CK.HomeAutomation.Hardware
Drivers para placas CCTools (relés, entradas), relés 433 MHz, y código Arduino Nano (puente sensores + emisor 433 MHz). Capa de abstracción (interfaces) para añadir nuevos drivers fácilmente.
CK.HomeAutomation.Telemetry
Dos componentes:
- CSV Writer: guarda cambios de estado en
BinaryStateOutputActuatorChanges.csv(descargable vía SMB admin). - AzureEventHubPublisher: envía cambios de estado y valores de sensores a Azure Event Hub. Incluye scripts SQL para tablas y consulta Stream Analytics. Cada cambio genera entrada START (nuevo estado) y END (duración total en segundos).
Reportes con Power BI gratuito.
WebApp
Proyecto CK.HomeAutomation.App: AngularJS + jQuery + Bootstrap. Configuración de habitaciones leída del controlador (Pi2), UI generada dinámicamente. Se abre como index.html o en servidor web. Configuration.js configura IP del controlador y traducciones. Para añadir a pantalla de inicio en iOS, debe servirse desde web server (ej. BananaPi + nginx).
Terminal
iPad 3 antiguo en salón como panel de control fijo.
Futuro
- Actuadores por infrarrojos (tiras RGB LED).
- Configuración XML además de código.
- Web App dedicada para tablet con layout distinto.
- Contactos reed para ventanas con estado en Web App.
- Librerías drivers para dispositivos de otros fabricantes.
- Control de válvulas de calefacción (salidas y lectura temp ya implementadas).
- Sistema de alarma (notificaciones si movimiento/ventanas abiertas).
- Estación meteorológica hardware.
- Cierre automático persianas si ventana abierta y lluvia detectada (API actual ya provee datos).
- Más tests unitarios.
- Documentación detallada en Wiki GitHub.
- Animaciones (implementadas en NETMF, pendientes migrar).
¿Interesado en contribuir (hardware, software, documentación)? ¡Contáctame!
Código
Repositorio completo (SDK, WebApp, configuración personal):
https://github.com/chkr1011/CK.HomeAutomation.git
Esquemáticos
- Circuito para leer códigos 433 MHz del mando.
- Placa circuito sensor DHT22 (una por habitación).
- Shield Raspberry Pi: LED estado + bornes I²C + interrupción.
- Sensor temp/humedad con emisor 433 MHz integrado (uno solo para toda la casa).
Proceso de manufactura
- Construya un registrador de temperatura con Raspberry Pi y sensor I2C de 5 $
- Monitorización meteorológica remota con Raspberry Pi 3 y PubNub
- Integración de TI SensorTag con Blynk vía Node‑RED en Raspberry Pi Zero
- Controle un LED con Sensor PIR de Movimiento en Raspberry Pi
- Monitoriza la temperatura de tu casa con un panel Raspberry Pi
- Leer pulsos de frecuencia cardíaca con Windows 10 IoT Core en Raspberry Pi: guía paso a paso
- Construye sistema domótico con Raspberry Pi para control remoto
- Envío de Datos IMU Adafruit 10DOF desde Raspberry Pi 2 a Azure Event Hubs con Windows 10 IoT Core
- Monitorización Precisa de Temperatura y Humedad con SHT15 en Windows 10 IoT Core
- Instalación de Windows 10 IoT Core en Raspberry Pi 3 Model B+: Guía Paso a Paso
- Construye un robot inteligente con Bridge Shield – Integración Raspberry Pi y Arduino