Taula de continguts:

Hub de domòtica Raspberry Pi-Arduino-SignalR: 11 passos (amb imatges)
Hub de domòtica Raspberry Pi-Arduino-SignalR: 11 passos (amb imatges)

Vídeo: Hub de domòtica Raspberry Pi-Arduino-SignalR: 11 passos (amb imatges)

Vídeo: Hub de domòtica Raspberry Pi-Arduino-SignalR: 11 passos (amb imatges)
Vídeo: 2018-11-20 Learning SignalR - Home Automation with .NET Core and Hubitat 2024, Juliol
Anonim
El centre d’automatització domèstica Raspberry Pi-Arduino-SignalR
El centre d’automatització domèstica Raspberry Pi-Arduino-SignalR

Després d’un parell dels meus IBLE de preludi publicats aquí i aquí, aquest projecte fa el primer pas cap a la creació d’una versió bàsica d’un Hub d’automatització domèstica funcional.

He utilitzat diverses tecnologies per intentar donar sentit a com puc utilitzar totes les coses que he après en el passat i les coses noves que continuo aprenent a mesura que avancen els dies.

Per tant, aquest centre d'automatització està format pels components següents:

Una base de dades SQL Server 2012 que:

  • emmagatzema una llista de codis d'infrarojos (IR) predeterminats en una taula juntament amb una "clau de codi" única
  • les claus de codi s'anomenen intuïtivament (per part de l'usuari) per tal d'identificar la finalitat dels seus codis IR associats

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

  • espera i rep "claus de codi" com a ordres d'un usuari davant d'un client HTML
  • quan es rep, es connecta a la base de dades SQL i recupera un codi IR mitjançant la clau de codi subministrada
  • retransmet el codi IR recuperat a un client Python SignalR

Un usuari que fa front al client del tauler de control de SignalR HTML que:

  • comunica una clau de codi única al concentrador mitjançant les API de client jQuery SignalR
  • cada botó del tauler representarà una clau de codi única registrada a la taula de base de dades SQL

Una aplicació de servei de fons Python SignalR que s’executa al Raspberry Pi 2.0 que:

  • rep codis IR com a ordres del Hub
  • busca delimitadors al codi IR i divideix el codi molt llarg en segments
  • es comunica a través del port sèrie a Arduino i escriu successivament cada segment

Un esbós del transmissor IR Arduino que:

  • espera i rep cadascun dels segments de codi IR a través del port sèrie
  • reuneix els segments de codi en una matriu de memòria intermèdia de codi IR
  • empaqueta la memòria intermèdia en una ordre IR Transmit mitjançant la biblioteca IRLib Arduino

Si l’aparell objectiu es troba a prop del transmissor IR, l’aparell (pot) reaccionar al senyal IR transmès per l’Arduino

NOTA

Tot i que l’aparell objectiu que faig servir en aquesta demostració reacciona als senyals IR, és possible que vulgueu llegir aquesta secció del meu altre IBLE per motius pels quals dic que l’aparell (pot) reaccionar al senyal IR.

És hora de rodar.

Pas 1: el que necessiteu abans que el que necessiteu

El que necessiteu, abans del que necessiteu
El que necessiteu, abans del que necessiteu
El que necessiteu, abans del que necessiteu
El que necessiteu, abans del que necessiteu
El que necessiteu, abans del que necessiteu
El que necessiteu, abans del que necessiteu

Aquest instructiu s’enlaira amb part de la feina feta anteriorment, que també va donar lloc al meu darrer IBLE.

Per tant, abans d’entrar en el que necessitem per a aquest IBLE, és recomanable que llegiu aquest document instructiu per obtenir informació sobre com:

  1. Es va crear la biblioteca infraroja Arduino IRLib
  2. Com es van capturar els codis IR utilitzats en aquest IBLE mitjançant un receptor IR
  3. Com s’utilitzaven els codis IR capturats per controlar l’aparell objectiu mitjançant un transmissor IR

Després de completar aquest IBLE, vaig desplegar una aplicació web ASP. NET IR Code Recorder que:

  • Accepteu el codi IR capturat juntament amb una clau de codi anomenada intuïtivament com a entrades mitjançant un formulari web
  • Divideix el codi IR de longitud completa en segments de menys de 64 caràcters per mantenir-se sota el límit de memòria intermèdia sèrie de l'Arduino Uno
  • L'últim segment de codis es preestabliria amb una "E" que indica a l'Arduino que ha rebut l'últim segment de codi.
  • Cada segment estaria separat per un delimitador de canonades abans de tornar a muntar-se en una cadena llarga
  • Finalment, el codi IR segmentat juntament amb la seva clau de codi es van emmagatzemar en una base de dades SQL Server 2012

Aquesta base de dades SQL és la que forma un dels components del Hub d’automatització domèstica elaborada en aquest IBLE.

NOTA

L'aplicació web IR Code Recorder no forma part del debat aquí pels motius següents:

  • Podeu capturar codis manualment mitjançant Arduino Sketch, dividir-los en seccions delimitades per canonades i emmagatzemar-los a la base de dades sense haver de crear una aplicació web elaborada.
  • A diferència d’aquest IBLE, l’enregistrador IR es centra en la comunicació inversa d’Arduino a Raspberry Pi

Per tant, els detalls sobre aquest projecte serien un tema per a un altre IBLE

Pas 2: què necessiteu: el maquinari

El que necessiteu: el maquinari
El que necessiteu: el maquinari
El que necessiteu: el maquinari
El que necessiteu: el maquinari

Un Raspberry Pi 2.0 en funcionament: recomano instal·lar Ubuntu Mate, ja que té un conjunt més ric de funcions, inclòs OpenLibre Office, que per cert era indispensable per documentar aquest instructiu allà mateix al Raspberry Pi.

A més, el Pi, necessitareu els següents externs:

  • La plataforma de prototipatge Arduino Uno o un clon
  • Un LED de transmissors d’IR: he utilitzat una marca anomenada Three Legs d’Amazon.com
  • Resistències de 330 o de 220 Ohm: he utilitzat les 220 (codi de color vermell-vermell-marró) perquè en tenia diverses útils
  • La placa normal, els connectors i un PC amb l'entorn Arduino instal·lat
  • Un candidat a la prova, com l’omnipresent monitor LED Samsung amb comandament a distància

Pas 3: què necessiteu: el programari

Per reunir totes les peces, caldrà instal·lar i executar la següent configuració de programari:

Al Raspberry Pi, haureu d’instal·lar el següent:

  • L’IDE Arduino: s’utilitza per construir Sketch i fer-lo arribar a l’ONU
  • El mòdul Python per a Arduino: per a la comunicació en sèrie entre l’ONU i el Pi
  • La biblioteca client Python SignalR: podeu consultar les instruccions adjuntes aquí

Una màquina Windows amb el següent entorn de desenvolupament instal·lat:

  • Edició gratuïta del Microsoft Visual Studio Express 2013 per crear l'aplicació client SignalR Hub i el web
  • Edició gratuïta de SQL Server 2012 Express per dissenyar i construir la base de dades de fons

Un entorn d’allotjament de Windows Internet Information Server (IIS):

  • Un cop s'hagi construït i provat el client SignalR Hub i el client web, s'haurà de desplegar a un servidor IIS local
  • En el meu cas, tinc previst utilitzar un ordinador portàtil antic amb Windows 7 amb IIS a la meva xarxa domèstica

NOTA

Totes les instruccions són aplicables a la versió de Python 2.7.x. La versió 3.0 pot requerir reescriptures

Pas 4: la base de dades de SQL Server

La base de dades SQL Server
La base de dades SQL Server

L'esquema adjunt mostra l'estructura d'una base de dades bàsica de SQL Server que s'utilitza en aquesta aplicació i conté només dues taules.

Taula AutoHubCode

Les dues columnes importants d'aquesta taula són:

AutoCodeKey: emmagatzema el nom fàcil de fer servir de la clau Code

Cadascuna de les claus de codi les transmet un client d’automatització, en el nostre cas, un botó HTML des d’una pàgina web

AutoCodeVal: emmagatzema la seqüència de codi IR en brut

Aquest és el codi IR real que es transmet al client en resposta del Hub SignalR

En aquest cas, un client Python en comunicació constant amb el Hub rep la seqüència de codis IR i la transmet per Port Serial a Arduino UNO

Taula AutoHubLog

  • Registra el codi sol·licitat pel client d'automatització.
  • Aquesta és una mesura per fer un seguiment de qui i quan es va utilitzar el sistema i quin codi es va sol·licitar

Com he esmentat, he utilitzat SQL Server 2012 com a plataforma de base de dades que he escollit. Podeu recrear aquest disseny senzill en una plataforma de base de dades diferent, com ara MySQL, Oracle, etc.

Tanmateix, aquí s'ha adjuntat l'SQL Script per crear aquesta base de dades

NOTA

  1. El codi del Hub SignalR està dissenyat per connectar-se a una base de dades SQL Server 2012
  2. Treballar amb una base de dades diferent significaria alterar el Hub per utilitzar un controlador de base de dades diferent

Pas 5: l'aplicació web ASP. NET SignalR Hub

L’aplicació web ASP. NET SignalR Hub
L’aplicació web ASP. NET SignalR Hub
L’aplicació web ASP. NET SignalR Hub
L’aplicació web ASP. NET SignalR Hub

L'aplicació web ASP. NET SignalR Hub inclou conjuntament els components següents, tal com s'indica a l'esquema adjunt:

Secció 1: el Hub SignalR que rep les sol·licituds del client i les respon

Seccions 2, 4: la pàgina web del client HTML i el full d'estil que formen col·lectivament la part frontal del sistema d'automatització i emeten ordres al centre d'automatització

Secció 3 - Les API SignalQ de jQuery que utilitza el client HTML per comunicar-se amb el centre d'automatització

Secció 5: el SignalR Hub no es comunica directament a la base de dades. Ho fa mitjançant classes intermèdies generades mitjançant l'Entity Framework

Aquestes classes abstracten els detalls de la base de dades de l'aplicació frontal

Secció 6: la classe de serveis de base de dades que ajuda a realitzar les operacions de lectura-escriptura a la base de dades SQL (descrites anteriorment) mitjançant classes d'Entity Framework

ASP. NET i SignalR són tecnologies de Microsoft i aquest tutorial us guiarà sobre com es crea i desplega una aplicació SignalR senzilla.

El que he construït aquí es basa en els conceptes bàsics adquirits en aquest tutorial. Quan es desplega, l'aplicació hauria de tenir un aspecte similar a la pàgina web que es mostra a la segona imatge

NOTA SOBRE EL CODI

S'ha adjuntat un fitxer ZIP que conté una versió del codi eliminada

L'estructura de carpetes és la que es mostra al visual, però totes les classes del marc i s'han eliminat els scripts jQuery per reduir la mida del fitxer adjunt

La recomanació és que aquest codi s’utilitzi com a guia perquè quan creeu una nova aplicació web SignalR seguint l’enllaç del tutorial anterior, s’afegiran automàticament les darreres biblioteques jQuery i classes de framework ASP. NET.

A més, les referències als scripts jQuery a la pàgina index.html hauran de canviar-se per reflectir la versió més recent de les biblioteques de clients jQuery SignalR que s’afegiran automàticament quan creeu la vostra aplicació web.

Finalment, s’haurà de canviar la cadena de connexió perquè coincideixi amb la vostra base de dades als fitxers anomenats com Web.config *

Pas 6: el client del servei Python SignalR

El client del servei Python SignalR
El client del servei Python SignalR

Tot i que el client SignalR HTML és una interfície d’usuari orientada cap a la part frontal, el client Python és una aplicació de servei d’extrem final que té com a funció principal rebre el codi IR transmès pel concentrador i encaminar-lo a Arduino UNO per comunicació serial.

El codi adjunt s’explica per si mateix i està prou documentat per descriure la seva funcionalitat

Com es mostra a la captura de pantalla composta, el client HTML i el client de Python Service es comuniquen a través del Hub SignalR de la següent manera:

  1. L'usuari del sistema d'automatització emet una ordre al concentrador mitjançant un clic de botó
  2. Cada botó està associat amb el codi de clau IR i, quan es fa clic, aquest codi es transmet al concentrador
  3. El Hub rep aquest codi, es connecta a la base de dades i recupera el codi de senyal IR cru i el transmet a tots els clients connectats

    Al mateix temps, el Hub registra una entrada a la taula de base de dades AutoHubLog que registra el codi i la data i hora que els clients remots van sol·licitar

  4. El client del servei Python rep el codi IR i el transmet a Arduino UNO per a un processament posterior

Pas 7: Esbós i codi de transmissió IR Arduino UNO

Esbós i codi de transmissió IR Arduino UNO
Esbós i codi de transmissió IR Arduino UNO
Esbós i codi de transmissió IR Arduino UNO
Esbós i codi de transmissió IR Arduino UNO
Esbós i codi de transmissió IR Arduino UNO
Esbós i codi de transmissió IR Arduino UNO

El circuit Arduino, tal com es mostra a la imatge, és força senzill per a aquest sistema i, per tant, es descriu breument:

  • El LED IR incolor s’ha de connectar al PIN digital 3 de l’ONU; això és un requisit de la biblioteca IRLib Arduino
  • Els motius es descriuen al meu IBLE anterior sobre la clonació d'un comandament a distància a la secció relacionada amb la biblioteca IRLib
  • El LED verd connectat al PIN digital 4 és un indicador visual que s’encén quan l’ONU ha rebut totes les seccions del codi IR del client Python que s’executa al Raspberry Pi.
  • Si aquest LED s’encén confirmarà que la comunicació en sèrie entre el Raspberry Pi i l’ONU funciona
  • Per habilitar la comunicació en sèrie, UNO està connectat al Raspberry Pi mitjançant el port USB
  • El Arduino Sketch adjunt es comenta prou per descriure la seva funció
  • Els comentaris de la part superior del codi també descriuen com s’ha de connectar el circuit

NOTA

A la pràctica, l’Arduino i el Pi es podrien connectar conjuntament a un concentrador USB alimentat prou fort com per accionar el Pi, l’Arduino i també transmetre un senyal fort a través del LED IR.

Pas 8: connectar i provar el sistema

Connectar i provar el sistema
Connectar i provar el sistema
Connectar i provar el sistema
Connectar i provar el sistema
Connectar i provar el sistema
Connectar i provar el sistema
  1. Creeu i desplegueu l'ASP. NET SignalR Hub, el client HTML juntament amb la base de dades SQL Server 2012 a un servidor d'informació d'Internet (IIS) a la vostra xarxa local local.
  2. Accediu a l'aplicació web obrint el client HTML SignalR per

    l'URL d'aquesta pàgina sol ser https:// el vostre ordinador: número_port /

  3. Feu clic a un botó del tauler de control i, si l'aplicació s'ha desplegat correctament, el concentrador respondrà retornant el codi IR i mostrant-lo al tauler gris adjunt al tauler de control.

    Recordeu! Haureu de carregar els codis a la vostra base de dades configurant la biblioteca del receptor IR i capturant els codis tal com es descriu a la meva IBLE anterior

  4. Connecteu l'Arduino al Raspberry Pi per USB: obriu l'IDE Arduino al Pi i assegureu-vos que l'ONU pugui establir la connexió amb el Pi

    Aquests articles sobre tutorial d'Arduino us ajudaran a aconseguir-ho bastant ràpidament

  5. Obriu el codi Python i feu els canvis següents segons corresponguin al vostre entorn

    • l'adreça del port sèrie de la vostra UNO adquirida des del pas 4
    • l'URL del hub SignalR per coincidir amb l'URL local del pas 2: en aquest exemple, seria https:// yourComputer: port_number / signalr
  6. Finalment, obriu l’Arduino Sketch a l’Arduino IDE al Raspberry Pi i feu-lo arribar a l’ONU
  7. Col·loqueu la placa de pa que manté el circuit molt a prop de l’aparell que voleu controlar; el LED d’IR ha de tenir una línia de visió clara amb el port del receptor d’IR de l’aparell.
  8. Inicieu el programa Python al Raspberry Pi prement el botó F5 de la barra d'eines Python IDLE
  9. Torneu al tauler de control del programa client HTML (pas 2) i feu clic a un botó (com ara Encendre o augmentar el volum)

Si el sistema s'ha configurat correctament, hauríeu de poder mostrar la pàgina del client HTML al vostre telèfon o tauleta i controlar el vostre dispositiu amb els botons de la pàgina del client HTML.

Pas 9: el sistema en acció

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

Les imatges anteriors mostren el sistema domòtic en acció un cop s'hagi configurat.

Des que vaig publicar aquest IBLE, he ampliat la interfície capturant uns quants codis IR del meu televisor LED VIZIO

Com es mostra al costat del comandament de fàbrica del televisor en el primer visual, hi ha poques funcions essencials d’aquest comandament incorporades a la interfície d’usuari web a la qual es accedeix a través de la meva tauleta.

Les imatges posteriors mostren la tauleta en primer pla amb el televisor al darrere responent a les ordres emeses des de la interfície web:

  1. Ordre d’apagat: el televisor s’apaga
  2. Ordre d'encesa: el televisor s'encén i apareix el logotip "V" quan la pantalla s'encén
  3. Ordre Silenci activat: apareix una barra horitzontal amb l’altaveu silenciat

En totes les proves, l'àrea gris al costat del tauler de control de la pantalla de la tauleta mostra l'ordre emesa pel client i la resposta enviada pel centre SignalR remot

Pas 10: Millora del sistema d'automatització i correccions relacionades

Aquest sistema es pot ampliar afegint més codis capturats de diferents sistemes. Tot i que aquesta part és fàcil, hi ha dos altres factors que haurà de tenir en compte.

Millora 1 (ràpida): treballar amb senyals IR de diferents longituds

  1. Els codis IR de diferents sistemes tenen diferents longituds, fins i tot entre dos productes del mateix fabricant.

    Per exemple, en aquest cas, la longitud de la matriu de codis IR del televisor LED és de 67, mentre que la de la barra de so Samsung és d’uns 87

  2. El que significa que, si primer activés la barra de so, la matriu de memòria intermèdia IR de l'esbós Arduino s'ompliria amb una seqüència de codis IR que conté 87 codis
  3. Després d'això, si encengués el televisor LED, ompliria la matriu de memòria intermèdia IR amb només 67 codis, però els 20 codis restants de l'operació anterior seguirien estant al voltant

El resultat? El televisor LED no s'encén perquè la memòria intermèdia de codi IR s'ha vist malmesa pels 20 codis addicionals que no s'han netejat de l'operació anterior.

Solució 1 (no es recomana la sortida fàcil)

Modifiqueu l'Arduino Sketch de la següent manera:

Canvieu les següents trucades de funció a la funció loop () {}

transmitIRCode ();

transmetreCodiIR (c);

Feu canvis a la signatura de la funció anterior:

void transmitIRCode (int codeLen) {// Constant RAWBUF substituïda per codeLen IRTransmitter. IRSendRaw:: send (IRCodeBuffer, codeLen, 38); }

Tot i que això és fàcil, la matriu mai no s’esborra del tot i, per tant, no és una solució molt neta

Solució 2 (no és difícil, es recomana)

Declareu una variable addicional a la part superior de l'Arduino Sketch, després de la secció de comentaris:

sense signar int EMPTY_INT_VALUE;

Afegiu-lo a la part superior de la funció setup ():

// Captureu l'estat natural d'una variable sencera sense signar buidaEMPTY_INT_VALUE = IRCodeBuffer [0];

Desplaceu-vos cap avall i afegiu una nova funció a l'esbós immediatament després de la funció transmitIRCode ():

void clearIRCodeBuffer (int codeLen) {// Esborra tots els codis de la matriu // NOTA: establir els elements de la matriu a 0 no és la solució per a (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = EMPTY_INT_VALUE;}}

Finalment, truqueu a la nova funció anterior a la següent ubicació de la funció loop ():

// Restableix - Reprèn la lectura del serial PortclearIRCodeBuffer (c); …

Es tracta d’un enfocament més net, ja que realment restableix totes les ubicacions de la matriu de memòria intermèdia IR que s’han completat amb el senyal de codi IR més recent sense deixar res a l’atzar.

Millora 2 (més implicat): transmissió de senyal IR repetida per a determinats dispositius

Alguns dispositius requereixen que es transmeti el mateix senyal diverses vegades per respondre Exemple: en aquest cas, la barra de so de Samsung requereix que s’enviï el mateix codi dues vegades amb un interval d’1 segon

La solució en concepte s'ha comentat aquí, ja que està una mica més implicada i necessitarà proves

Si afegiu la funcionalitat de repetició a Ardunio Sketch, haureu de fer flaixar Sketch cada vegada que afegiu un dispositiu nou al vostre sistema domòtic.

En lloc d'això, afegir aquesta correcció al client HTML SignalR i a l'aplicació Python SignalR Service fa que la solució sigui molt més flexible. I això es podria aconseguir en principi de la següent manera:

Modifiqueu el client HTML SignalR per transmetre informació repetida al concentrador

Obriu index.html i incorporeu el valor de repetició al botó HTML de la manera següent:

value = "SMSNG-SB-PWR-ON" esdevindria value = "SMSNG-SB-PWR-ON_2_1000"

On, 2 és el valor de repetició i 1000 és el valor de retard en mil·lisegons entre els dos senyals de repetició

Quan feu clic a aquest botó, el hub SignalR rebrà el codi clau + Repetir_espec

Modifiqueu els mètodes laterals del servidor SignalR per analitzar només el codi clau:

  • Utilitzeu el codi clau per recuperar el codi IR de la base de dades com de costum
  • Transmeteu el codi clau + Repetir_espec i el codi IRC als clients SingalR com és habitual

Modifiqueu l'aplicació Python SignalR Service per transmetre senyals mitjançant els valors Repetir:

Obriu el client Python i modifiqueu les dues funcions següents:

def print_command_from_hub (buttonId, cmdSrc):

# analitzeu el codi de repetició des del valor buttonId

def transmissionToArduino (IRSignalCode, delim, endPrefix):

# configureu una estona o un bucle per transmetre el senyal a la freqüència desitjada

  • D'aquesta manera, l'Arduino no ha de ser intermitent repetidament
  • Aquest sistema podria incorporar qualsevol nombre de freqüències de repetició
  • A més, si utilitzeu UNO, hi ha un límit en la mida que pot fer el vostre Sketch.

Pas 11: problemes coneguts i problemes de seguretat

Com és el cas dels sistemes construïts la primera vegada, aquest té un parell de problemes que van sorgir durant les proves.

Problema 1: activar ordres de manera ràpida amb retards inferiors a un segon entre els clics de botó va fer que el sistema deixés de respondre després de respondre el primer parell de vegades.

  • Reiniciar el client Python SignalR restableix el sistema a les operacions normals
  • Les resolucions immediates poden ser eliminar les sortides de depuració no desitjades de tots dos, el client Python SignalR i també l'Arduino Sketch i repetir aquestes proves.
  • Un altre lloc on s’hauria de mirar seria la comunicació serial mateixa: seria possible afegir codi per netejar ràpidament la memòria intermèdia?

Dit això, he notat que el meu televisor no respon bé al seu comandament a distància de fàbrica; per tant, la naturalesa mateixa de la comunicació IR del meu televisor també pot contribuir.

Problema 2: La pantalla HTML deixa de respondre als clics de botó després d'un llarg període d'inactivitat

Normalment, actualitzar la pàgina resol aquest comportament, però la causa d’aquest comportament encara no està clara

PREOCUPACIONS DE SEGURETAT

Aquest sistema ha estat dissenyat només per a ús de la xarxa local (domèstica) i no disposa de les garanties de seguretat necessàries per utilitzar-se a Internet

Per tant, es recomana que el SignalR Hub es desplegui a una màquina local de la vostra xarxa local / domèstica

Gràcies per llegir el meu IBLE i espero que us divertiu!

Recomanat: