Tabla de contenido:

El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR: 11 pasos (con imágenes)
El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR: 11 pasos (con imágenes)

Video: El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR: 11 pasos (con imágenes)

Video: El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR: 11 pasos (con imágenes)
Video: Domotizo mi casa de manera sencilla, fácil y barata💰 2024, Noviembre
Anonim
El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR
El concentrador de automatización del hogar Raspberry Pi-Arduino-SignalR

Después de algunos de mis IBLE preludios publicados aquí y aquí, este proyecto da el primer paso hacia la construcción de una versión básica de un Centro de automatización del hogar funcional.

He usado varias tecnologías diferentes en un esfuerzo por entender cómo puedo usar todas las cosas que he aprendido en el pasado y las cosas nuevas que continúo aprendiendo a medida que avanzan los días.

Por lo tanto, este Centro de automatización se compone de los siguientes componentes:

Una base de datos de SQL Server 2012 que:

  • almacena una lista de códigos de infrarrojos (IR) predeterminados en una tabla junto con una "clave de código" única
  • las teclas de código reciben un nombre intuitivo (por parte del usuario) para identificar el propósito de sus códigos IR asociados

Una aplicación web ASP. NET SignalR Hub en tiempo real que:

  • espera y recibe "claves de código" como comandos de un usuario frente a un cliente HTML
  • cuando se recibe, se conecta a la base de datos SQL y recupera un código IR utilizando la clave de código proporcionada
  • transmite el código IR recuperado a un cliente Python SignalR

Un cliente de panel de SignalR HTML orientado al usuario que:

  • comunica una clave de código única al Hub a través de las API de jQuery SignalR Client
  • cada botón del panel representará una clave de código única registrada en la tabla de la base de datos SQL

Una aplicación de servicio en segundo plano Python SignalR que se ejecuta en Raspberry Pi 2.0 que:

  • recibe códigos IR como comandos del Hub
  • busca delimitadores en el código IR y divide el código muy largo en segmentos
  • se comunica a través del puerto serie a Arduino y escribe cada segmento en sucesión

Un bosquejo del transmisor de infrarrojos Arduino que:

  • espera y recibe cada uno de los segmentos de código IR a través del puerto serie
  • ensambla los segmentos de código en una matriz de búfer de código IR
  • empaqueta el búfer en un comando de transmisión IR utilizando la biblioteca IRLib Arduino

Si el dispositivo de destino está cerca del transmisor de infrarrojos, entonces el dispositivo (puede) reaccionar a la señal de infrarrojos transmitida por Arduino.

NOTA

Aunque el aparato de destino que utilizo en esta demostración reacciona a las señales de infrarrojos, es posible que desee leer esta sección de mi otro IBLE por las razones por las que digo que el aparato (puede) reaccionar a la señal de infrarrojos.

Hora de rodar.

Paso 1: lo que necesita, antes de lo que necesita

Lo que necesita, antes de lo que necesita
Lo que necesita, antes de lo que necesita
Lo que necesita, antes de lo que necesita
Lo que necesita, antes de lo que necesita
Lo que necesita, antes de lo que necesita
Lo que necesita, antes de lo que necesita

Este instructable despega con parte del trabajo realizado anteriormente que también resultó en mi último IBLE.

Entonces, antes de entrar en lo que necesitamos para este IBLE, se recomienda que lea este instructivo para conocer algunos antecedentes sobre cómo:

  1. Se configuró la biblioteca de infrarrojos Arduino IRLib
  2. Cómo se capturaron los códigos de infrarrojos utilizados en este IBLE mediante un receptor de infrarrojos
  3. Cómo se utilizaron los códigos de infrarrojos capturados para controlar el dispositivo de destino a través de un transmisor de infrarrojos

Después de completar este IBLE, implementé una aplicación web ASP. NET IR Code Recorder que:

  • Acepte el código IR capturado junto con una clave de código con nombre intuitivo como entradas a través de un formulario web
  • Divida el código IR de longitud en segmentos de menos de 64 caracteres para permanecer por debajo del límite de búfer serial del Arduino Uno
  • El último segmento de códigos estaría prefijado con una "E" que indica al Arduino que ha recibido el último segmento de código.
  • Cada segmento estaría separado por un delimitador de tubería antes de volver a ensamblarse en una cadena larga
  • Finalmente, el código IR segmentado junto con su clave de código se almacenó en una base de datos de SQL Server 2012

Es esta base de datos SQL la que forma uno de los componentes del Home Automation Hub elaborado en este IBLE.

NOTA

La aplicación web IR Code Recorder no forma parte de la discusión aquí por las siguientes razones:

  • Puede capturar códigos manualmente utilizando Arduino Sketch, dividirlos en secciones delimitadas por tuberías y almacenarlos en la base de datos sin tener que crear una aplicación web elaborada.
  • A diferencia de este IBLE, el grabador de infrarrojos se centra en la comunicación inversa de Arduino a Raspberry Pi

Por lo tanto, los detalles de este proyecto serían un tema para otro IBLE.

Paso 2: Qué necesita: el hardware

Lo que necesita: el hardware
Lo que necesita: el hardware
Lo que necesita: el hardware
Lo que necesita: el hardware

Una Raspberry Pi 2.0 en funcionamiento: recomiendo instalar Ubuntu Mate, ya que tiene un conjunto más rico de características que incluyen OpenLibre Office, que por cierto fue indispensable para documentar este instructable, allí mismo en la Raspberry Pi.

Además, el Pi, necesitará los siguientes externos:

  • La plataforma de creación de prototipos Arduino Uno o un clon
  • Un LED de transmisores de infrarrojos: utilicé una marca llamada Three Legs de Amazon.com
  • 330 o resistencias de 220 ohmios: utilicé el 220 (código de color rojo-rojo-marrón) porque tenía varios a mano
  • La placa de pruebas habitual, conectores y una PC con el entorno Arduino instalado
  • Un candidato de prueba, como el omnipresente monitor LED Samsung con control remoto

Paso 3: Qué necesita: el software

Para unir todas las piezas, la siguiente configuración de software deberá estar instalada y en ejecución:

En la Raspberry Pi, deberá instalar lo siguiente:

  • El IDE de Arduino: utilizado para construir el Sketch y actualizarlo a UNO
  • El módulo Python para Arduino: para la comunicación en serie entre UNO y Pi
  • La biblioteca cliente de Python SignalR: puede consultar las instrucciones adjuntas aquí

Una máquina Windows con el siguiente entorno de desarrollo instalado:

  • Edición gratuita de Microsoft Visual Studio Express 2013 para crear SignalR Hub y la aplicación cliente web
  • Edición gratuita de SQL Server 2012 Express para diseñar y construir la base de datos back-end

Un entorno de alojamiento Windows Internet Information Server (IIS):

  • Una vez que el SignalR Hub y el cliente web estén construidos y probados, deberán implementarse en un servidor IIS local.
  • En mi caso, planeo usar una computadora portátil vieja con Windows 7 con IIS en mi red doméstica

NOTA

Todas las instrucciones son aplicables a la versión Python 2.7.x. La versión 3.0 puede requerir reescrituras

Paso 4: la base de datos de SQL Server

La base de datos de SQL Server
La base de datos de SQL Server

El esquema adjunto muestra la estructura de una base de datos básica de SQL Server utilizada en esta aplicación y contiene solo dos tablas.

Tabla AutoHubCode

Las dos columnas importantes de esta tabla son:

AutoCodeKey: almacena el nombre fácil de usar de la clave de código

Cada una de las claves de código es transmitida por un cliente de automatización, en nuestro caso, un botón HTML de una página web

AutoCodeVal: almacena la secuencia de código IR sin procesar

Este es el código IR real que se transmite al cliente en respuesta a SignalR Hub

En este caso, un cliente Python en constante comunicación con el Hub recibe la secuencia de código IR y la transmite a través del puerto serie al Arduino UNO.

Tabla AutoHubLog

  • Registra el código solicitado por el cliente de automatización.
  • Esta es una medida para rastrear quién y cuándo usó el sistema, y qué código se solicitó.

Como se mencionó, he usado SQL Server 2012 como mi plataforma de base de datos de elección. Puede recrear este diseño simple en una plataforma de base de datos diferente, como MySQL, Oracle, etc.

Sin embargo, aquí se adjunta el script SQL para crear esta base de datos

NOTA

  1. El código de SignalR Hub está diseñado para conectarse a una base de datos de SQL Server 2012
  2. Trabajar con una base de datos diferente significaría alterar el Hub para usar un controlador de base de datos diferente

Paso 5: la aplicación web ASP. NET SignalR Hub

La aplicación web ASP. NET SignalR Hub
La aplicación web ASP. NET SignalR Hub
La aplicación web ASP. NET SignalR Hub
La aplicación web ASP. NET SignalR Hub

La aplicación web ASP. NET SignalR Hub se compone conjuntamente de los siguientes componentes, como se indica en el esquema adjunto:

Sección 1 - El SignalR Hub que recibe solicitudes y responde al cliente

Secciones 2, 4 - La página web del cliente HTML y su hoja de estilo que forman colectivamente la parte frontal del sistema de Automatización y emite comandos al Centro de Automatización.

Sección 3: las API de jQuery SignalR utilizadas por el cliente HTML para comunicarse con Automation Hub

Sección 5: SignalR Hub no se comunica directamente con la base de datos. Lo hace a través de clases intermedias generadas utilizando Entity Framework.

Estas clases abstraen los detalles de la base de datos de la aplicación frontal.

Sección 6: la clase de servicio de la base de datos que ayuda a realizar las operaciones de lectura y escritura en la base de datos SQL (descrita anteriormente) mediante el uso de clases de Entity Framework

ASP. NET y SignalR son tecnologías de Microsoft y este tutorial lo guiará sobre cómo se construye e implementa una aplicación simple de SignalR.

Lo que he creado aquí se basa en los conceptos básicos adquiridos en este tutorial. Cuando se implementa, la aplicación debe tener un aspecto similar a la página web que se muestra en la segunda imagen.

NOTA SOBRE EL CÓDIGO

Se ha adjuntado un archivo ZIP que contiene una versión simplificada del código.

La estructura de carpetas es como se muestra en la imagen; sin embargo, todas las clases de framework y los scripts de jQuery se han eliminado para reducir el tamaño del archivo adjunto.

La recomendación es que este código se use como guía porque cuando crea una nueva aplicación web de SignalR siguiendo el enlace del tutorial anterior, las últimas bibliotecas jQuery y clases de marco ASP. NET se agregarán automáticamente

Además, las referencias a los scripts de jQuery en la página index.html deberán cambiarse para reflejar la última versión de las bibliotecas cliente de jQuery SignalR que se agregarán automáticamente cuando construya su aplicación web.

Finalmente, la cadena de conexión deberá cambiarse para que coincida con su base de datos en los archivos denominados como Web.config *

Paso 6: el cliente del servicio Python SignalR

El cliente del servicio Python SignalR
El cliente del servicio Python SignalR

Mientras que HTML SignalR Client es una interfaz de usuario frontal, Python Client es una aplicación de servicio de back-end cuya función principal es recibir el código IR transmitido por el Hub y enrutarlo al Arduino UNO a través de la comunicación serial.

El código adjunto se explica por sí mismo y está lo suficientemente documentado para describir su funcionalidad

Como se muestra en la captura de pantalla compuesta, el cliente HTML y el cliente del servicio Python se comunican a través de SignalR Hub de la siguiente manera:

  1. El usuario del sistema de automatización emite un comando al Hub mediante un clic en un botón
  2. Cada botón está asociado con el código de la llave IR y cuando se hace clic en él, este código se transmite al Hub
  3. El Hub recibe este código, se conecta a la base de datos y recupera el código de la señal IR sin procesar y lo transmite a todos los clientes conectados.

    Al mismo tiempo, el Hub registra una entrada en la tabla de la base de datos AutoHubLog registrando el código y la fecha y hora en que fue solicitado por los clientes remotos

  4. El cliente del servicio Python recibe el código IR y lo transmite al Arduino UNO para su posterior procesamiento.

Paso 7: Boceto y código de transmisión IR de Arduino UNO

El boceto y el código de transmisión IR de Arduino UNO
El boceto y el código de transmisión IR de Arduino UNO
El boceto y el código de transmisión IR de Arduino UNO
El boceto y el código de transmisión IR de Arduino UNO
El boceto y el código de transmisión IR de Arduino UNO
El boceto y el código de transmisión IR de Arduino UNO

El circuito Arduino como se muestra en las imágenes es bastante simple para este sistema y, por lo tanto, se describe brevemente:

  • El LED IR incoloro debe estar conectado al PIN digital 3 en UNO; este es un requisito de la biblioteca IRLib Arduino
  • Las razones se describen en mi IBLE anterior sobre la clonación de un control remoto en la sección relacionada con la biblioteca IRLib.
  • El LED verde conectado al PIN digital 4 es un indicador visual que se enciende cuando UNO ha recibido todas las secciones del código IR del cliente Python que se ejecuta en Raspberry Pi.
  • Tener este LED encendido confirmará que la comunicación serial entre Raspberry Pi y UNO está funcionando
  • Para habilitar la comunicación en serie, el UNO está conectado a la Raspberry Pi a través del puerto USB
  • El Arduino Sketch adjunto se comenta lo suficiente para describir su función
  • Los comentarios en la parte superior del código también describen cómo se debe conectar el circuito.

NOTA

En la práctica, el Arduino y el Pi podrían conectarse conjuntamente a un concentrador USB con alimentación lo suficientemente fuerte como para impulsar el Pi, el Arduino y también transmitir una señal fuerte a través del LED IR.

Paso 8: Conexión y prueba del sistema

Conexión y prueba del sistema
Conexión y prueba del sistema
Conexión y prueba del sistema
Conexión y prueba del sistema
Conexión y prueba del sistema
Conexión y prueba del sistema
  1. Cree e implemente ASP. NET SignalR Hub, el cliente HTML junto con la base de datos de SQL Server 2012 en un servidor de información de Internet (IIS) en su red doméstica local.
  2. Acceda a la aplicación web abriendo el cliente HTML SignalR a través de

    la URL de esta página suele ser https:// yourComputer: port_number /

  3. Haga clic en un botón del panel de control y, si la aplicación se ha implementado correctamente, el Hub responderá devolviendo el código IR y mostrándolo en el panel gris contiguo al panel de control.

    ¡Recordar! Tendrá que cargar los códigos en su base de datos configurando la biblioteca del receptor de infrarrojos y capturando los códigos como se describe en mi IBLE anterior

  4. Conecte el Arduino a la Raspberry Pi a través de USB: abra el IDE de Arduino en la Pi y asegúrese de que UNO pueda establecer una conexión con la Pi

    Estos artículos de tutoriales de Arduino deberían ayudarlo a llegar a esto con bastante rapidez

  5. Abra el código Python y realice los siguientes cambios según corresponda a su entorno

    • la dirección del puerto serie de su UNO como se adquirió en el paso 4
    • la URL del concentrador de SignalR para que coincida con la URL local del paso 2; en este ejemplo, sería https:// yourComputer: port_number / signalr
  6. Por último, abra el Arduino Sketch en el IDE de Arduino en la Raspberry Pi y muévalo al UNO
  7. Coloque la placa de prueba que sostiene el circuito muy cerca del aparato que se va a controlar; el LED de infrarrojos debe tener una línea de visión clara con el puerto del receptor de infrarrojos del aparato
  8. Inicie el programa Python en la Raspberry Pi presionando el botón F5 en la barra de herramientas Python IDLE
  9. Regrese al Panel de control en el programa cliente HTML (Paso 2) y haga clic en un botón (como Encender o Subir volumen)

Si el sistema se ha configurado correctamente, entonces debería poder abrir la página del cliente HTML en su teléfono o tableta y controlar su dispositivo con los botones de la página del cliente HTML.

Paso 9: El sistema en acción

El sistema en acción
El sistema en acción
El sistema en acción
El sistema en acción
El sistema en acción
El sistema en acción
El sistema en acción
El sistema en acción

Las imágenes de arriba muestran el sistema de automatización del hogar en acción una vez que está configurado.

Desde que publiqué este IBLE, he ampliado la interfaz capturando algunos códigos IR de mi TV LED VIZIO

Como se muestra al lado del control remoto de TV de fábrica en la primera imagen, algunas funciones esenciales de este control remoto se han integrado en la interfaz de usuario web a la que se accede a través de mi tableta.

Las imágenes posteriores muestran la tableta en primer plano con el televisor en la parte posterior respondiendo a los comandos emitidos desde la interfaz web:

  1. Comando de apagado: el televisor se apaga
  2. Comando de encendido: el televisor se enciende y aparece el logotipo "V" cuando se enciende la pantalla
  3. Comando Mute ON: aparece una barra horizontal con el altavoz silenciado

En todas las pruebas, el área gris junto al tablero en la pantalla de la tableta muestra el comando emitido por el cliente y la respuesta enviada por el SignalR Hub remoto.

Paso 10: Mejora del sistema de automatización y arreglos relacionados

Este sistema se puede ampliar agregando más códigos capturados de diferentes sistemas. Si bien esta parte es fácil, hay otros dos factores que deberá tener en cuenta.

Mejora 1 (rápida): trabajar con señales de infrarrojos de diferentes longitudes

  1. Los códigos IR de diferentes sistemas vienen con diferentes longitudes, incluso entre dos productos del mismo fabricante.

    Por ejemplo, en este caso, la longitud de la matriz de códigos IR para el televisor LED es 67, mientras que la de la barra de sonido Samsung es de alrededor de 87

  2. Lo que significa que, si encendiera la barra de sonido primero, la matriz de búfer de infrarrojos en el boceto de Arduino se rellenaría con una secuencia de código de infrarrojos que contiene 87 códigos.
  3. Después de esto, si encendiera el televisor LED, llenaría la matriz de búfer de infrarrojos con solo 67 códigos, pero los 20 códigos restantes de la operación anterior aún estarían disponibles.

¿El resultado? El televisor LED no se enciende porque el búfer de códigos de infrarrojos ha sido dañado por los 20 códigos adicionales que no se limpiaron de la operación anterior.

Arreglar 1 (la salida más fácil, no recomendada)

Modifique el boceto de Arduino de la siguiente manera:

Cambie las siguientes llamadas de función en la función loop () {}

transmitIRCode ();

para transmitirIRCode (c);

Realice cambios en la firma de la función anterior:

void transmitIRCode (int codeLen) {// Constante RAWBUF reemplazada por codeLen IRTransmitter. IRSendRaw:: send (IRCodeBuffer, codeLen, 38); }

Si bien esto es fácil, la matriz nunca se borra por completo y, por lo tanto, esta no es una solución muy limpia.

Arreglar 2 (no es difícil, se recomienda)

Declare una variable adicional en la parte superior del Arduino Sketch, después de la sección de comentarios:

unsigned int EMPTY_INT_VALUE;

Agregue esto a la parte superior de la función setup ():

// Captura el estado natural de una variable entera vacía sin signoEMPTY_INT_VALUE = IRCodeBuffer [0];

Desplácese hacia abajo y agregue una nueva función al boceto inmediatamente después de la función transmitIRCode ():

void clearIRCodeBuffer (int codeLen) {// Borrar todos los códigos de la matriz // NOTA: ¡establecer los elementos de la matriz en 0 no es la solución! for (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = VACÍO_INT_VALOR;}}

Finalmente, llame a la nueva función anterior en la siguiente ubicación en la función loop ():

// Restablecer - Reanudar la lectura Serial PortclearIRCodeBuffer (c);…

Este es un enfoque más limpio, ya que en realidad restablece todas las ubicaciones en la matriz de búfer de infrarrojos que fueron pobladas por la señal de código de infrarrojos más reciente sin dejar nada al azar.

Mejora 2 (más involucrada): Transmisión de señal IR repetida para ciertos dispositivos

Algunos dispositivos requieren que la misma señal se transmita varias veces para responder Ejemplo: en este caso, la barra de sonido de Samsung requiere que el mismo código se envíe dos veces con un intervalo de 1 segundo

El Fix in Concept se ha discutido aquí, ya que es un poco más complicado y necesitará pruebas

Agregar la funcionalidad de repetición al Ardunio Sketch significará que tendrá que flashear el Sketch cada vez que agregue un nuevo dispositivo a su sistema de automatización del hogar.

En cambio, agregar esta solución al cliente HTML SignalR y la aplicación Python SignalR Service hace que la solución sea mucho más flexible. Y esto podría lograrse en principio de la siguiente manera:

Modificar el cliente HTML de SignalR para transmitir información repetida al Hub

Abra index.html e incruste el valor de repetición en el botón HTML así:

value = "SMSNG-SB-PWR-ON" se convertiría en value = "SMSNG-SB-PWR-ON_2_1000"

Donde, 2 es el valor de repetición y 1000 es el valor de retardo en milisegundos entre las dos señales de repetición

Al hacer clic en este botón, el concentrador SignalR recibirá el código clave + Repeat_Spec

Modifique los métodos del lado del servidor de SignalR para analizar solo el código clave:

  • Utilice el código clave para recuperar el código IR de la base de datos como de costumbre
  • Transmita el código clave + Repeat_Spec y el código IR a los clientes de SingalR como de costumbre

Modifique la aplicación de servicio Python SignalR para transmitir señales utilizando los valores de repetición:

Abra el cliente Python y modifique las siguientes dos funciones:

def print_command_from_hub (buttonId, cmdSrc):

# analizar el código de repetición del valor buttonId

def transmitToArduino (IRSignalCode, delim, endPrefix):

# configurar un bucle while o for para transmitir la señal a la frecuencia deseada

  • De esta manera, el Arduino no tiene que ser flasheado repetidamente
  • Se puede incorporar cualquier número de frecuencias de repetición en este sistema.
  • Además, si está utilizando UNO, ¡hay un límite en el tamaño que puede alcanzar su Sketch!

Paso 11: Problemas conocidos y preocupaciones de seguridad

Como es el caso de los sistemas construidos por primera vez, este tiene un par de problemas que surgieron durante las pruebas.

Problema 1: el disparo de comandos en rápida sucesión con retrasos de menos de un segundo entre los clics de los botones hizo que el sistema dejara de responder después de responder el primer par de veces.

  • Reiniciar el cliente Python SignalR restaura el sistema a las operaciones normales.
  • Las resoluciones inmediatas pueden ser eliminar las salidas de depuración no deseadas tanto en Python SignalR Client como en Arduino Sketch y repetir estas pruebas
  • Otro lugar para investigar sería la propia comunicación serial: ¿sería posible agregar código para vaciar rápidamente el búfer?

Dicho esto, he notado que mi televisor no responde bien al control remoto de fábrica; por lo tanto, la naturaleza misma de la comunicación por infrarrojos de mi televisor también puede ser un factor contribuyente.

Problema 2: la pantalla HTML deja de responder a los clics de los botones después de un largo período de inactividad

Por lo general, la actualización de la página resuelve este comportamiento; sin embargo, la causa de este comportamiento aún no está clara

PREOCUPACIONES DE SEGURIDAD

Este sistema ha sido diseñado solo para uso en redes locales (domésticas) y no cuenta con las protecciones de seguridad necesarias para su uso en Internet

Por lo tanto, se recomienda que SignalR Hub se implemente en una máquina local en su red local / doméstica

¡Gracias por leer mi IBLE y espero que se diviertan!

Recomendado: