Sommario:

L'hub di automazione domestica Raspberry Pi-Arduino-SignalR: 11 passaggi (con immagini)
L'hub di automazione domestica Raspberry Pi-Arduino-SignalR: 11 passaggi (con immagini)

Video: L'hub di automazione domestica Raspberry Pi-Arduino-SignalR: 11 passaggi (con immagini)

Video: L'hub di automazione domestica Raspberry Pi-Arduino-SignalR: 11 passaggi (con immagini)
Video: HOME ASSISTANT AMBER: l'hub con Raspberry PI CM4 2024, Dicembre
Anonim
L'hub di automazione domestica Raspberry Pi-Arduino-SignalR
L'hub di automazione domestica Raspberry Pi-Arduino-SignalR

Seguendo un paio dei miei IBLE preludio pubblicati qui e qui, questo progetto fa il primo passo verso la costruzione di una versione base di un hub di automazione domestica funzionale.

Ho usato diverse tecnologie nel tentativo di dare un senso a come potrei essere in grado di utilizzare tutte le cose che ho imparato in passato e le cose nuove che continuo a imparare con il passare dei giorni.

Pertanto, questo Hub di automazione è composto dai seguenti componenti:

Un database SQL Server 2012 che:

  • memorizza un elenco di codici a infrarossi (IR) predeterminati in una tabella insieme a una "chiave di codice" univoca
  • le chiavi a codice sono nominate in modo intuitivo (dall'utente) in modo da identificare lo scopo dei codici IR ad esse associati

Un'applicazione Web ASP. NET SignalR Hub in tempo reale che:

  • attende e riceve "chiavi di codice" come comandi da un client HTML rivolto all'utente
  • quando ricevuto, si connette al database SQL e recupera un codice IR utilizzando la chiave del codice fornita
  • inoltra il codice IR recuperato a un client Python SignalR

Un client HTML SignalR Dashboard rivolto all'utente che:

  • comunica una chiave di codice univoca all'hub tramite le API client jQuery SignalR
  • ogni pulsante sulla Dashboard rappresenterà una chiave di codice univoca registrata nella tabella del database SQL

Un'applicazione del servizio in background Python SignalR in esecuzione su Raspberry Pi 2.0 che:

  • riceve codici IR come comandi dall'Hub
  • cerca i delimitatori nel codice IR e suddivide il codice molto lungo in segmenti
  • comunica tramite la porta seriale ad Arduino e scrive ogni segmento in successione

Uno schizzo del trasmettitore IR Arduino che:

  • attende e riceve ciascuno dei segmenti di codice IR sulla porta seriale
  • assembla i segmenti di codice in un array di buffer del codice IR
  • pacchettizza il buffer in un comando IR Transmit usando la libreria IRLib Arduino

Se l'appliance di destinazione si trova nelle vicinanze del trasmettitore IR, l'appliance (può) reagire al segnale IR trasmesso da Arduino

NOTA

Sebbene l'appliance di destinazione che utilizzo in questa dimostrazione reagisca ai segnali IR, potresti voler leggere questa sezione del mio altro IBLE per i motivi per cui dico che l'appliance (potrebbe) reagire al segnale IR.

È ora di rotolare.

Passaggio 1: ciò di cui hai bisogno, prima di ciò di cui hai bisogno

Quello che ti serve, prima di quello che ti serve
Quello che ti serve, prima di quello che ti serve
Quello che ti serve, prima di quello che ti serve
Quello che ti serve, prima di quello che ti serve
Quello che ti serve, prima di quello che ti serve
Quello che ti serve, prima di quello che ti serve

Questo istruibile decolla con parte del lavoro svolto in precedenza che ha portato anche al mio ultimo IBLE.

Quindi, prima di entrare in ciò di cui abbiamo bisogno per questo IBLE, ti consigliamo di leggere questo istruibile per un po' di informazioni su come:

  1. La libreria a infrarossi IRLib di Arduino è stata configurata
  2. Come sono stati acquisiti i codici IR utilizzati in questo IBLE utilizzando un ricevitore IR
  3. Come sono stati utilizzati i codici IR acquisiti per controllare l'apparecchio di destinazione tramite un trasmettitore IR

Dopo il completamento di questo IBLE, ho distribuito un'applicazione web ASP. NET IR Code Recorder che avrebbe:

  • Accetta il codice IR catturato insieme a un codice chiave dal nome intuitivo come input tramite un modulo web
  • Rompi il codice IR molto lungo in segmenti di lunghezza inferiore a 64 caratteri per rimanere al di sotto del limite del buffer seriale di Arduino Uno
  • L'ultimo segmento di codice sarebbe preceduto da una "E" che indica ad Arduino che ha ricevuto l'ultimo segmento di codice
  • Ogni segmento sarebbe separato da un delimitatore di tubi prima di essere assemblato di nuovo in una lunga stringa
  • Infine, il codice IR segmentato insieme alla sua chiave di codice è stato archiviato in un database SQL Server 2012

È questo database SQL che costituisce uno dei componenti dell'hub di automazione domestica elaborato in questo IBLE.

NOTA

L'applicazione Web IR Code Recorder non fa parte della discussione qui per i seguenti motivi:

  • È possibile acquisire manualmente i codici utilizzando Arduino Sketch, suddividerli in sezioni delimitate da pipe e archiviarli nel database senza dover creare un'applicazione Web elaborata
  • A differenza di questo IBLE, il registratore IR si concentra sulla comunicazione inversa da Arduino a Raspberry Pi

Pertanto i dettagli su questo progetto sarebbero un argomento per un altro IBLE

Passaggio 2: ciò di cui hai bisogno: l'hardware

Quello che ti serve: l'hardware
Quello che ti serve: l'hardware
Quello che ti serve: l'hardware
Quello che ti serve: l'hardware

Un Raspberry Pi 2.0 funzionante - Raccomando di installare Ubuntu Mate in quanto ha un set più ricco di funzionalità tra cui OpenLibre Office che tra l'altro era indispensabile per documentare questo istruibile, proprio lì sul Raspberry Pi.

Inoltre, il Pi, avrai bisogno dei seguenti elementi esterni:

  • La piattaforma di prototipazione Arduino Uno o un clone
  • Un LED per trasmettitori IR - Ho usato un marchio chiamato Three Legs da Amazon.com
  • Resistenze da 330 o da 220 Ohm - ho usato le 220 (codice colore Rosso-Rosso-Marrone) perché ne avevo diverse a portata di mano
  • La solita breadboard, connettori e un PC con l'ambiente Arduino installato
  • Un candidato al test, come l'onnipresente Samsung LED Monitor con telecomando

Passaggio 3: ciò di cui hai bisogno: il software

Per mettere insieme tutti i pezzi, sarà necessario installare ed eseguire la seguente configurazione del software:

Sul Raspberry Pi, dovrai installare quanto segue:

  • L'IDE Arduino - utilizzato per creare lo schizzo e installarlo su UNO
  • Il modulo Python per Arduino - per la comunicazione seriale tra UNO e Pi
  • La libreria client Python SignalR: puoi fare riferimento alle istruzioni allegate qui

Una macchina Windows con il seguente ambiente di sviluppo installato:

  • Edizione gratuita di Microsoft Visual Studio Express 2013 per creare l'hub SignalR e l'applicazione client Web
  • Edizione gratuita di SQL Server 2012 Express per progettare e costruire il database di back-end

Un ambiente di hosting di Windows Internet Information Server (IIS):

  • Una volta che l'hub SignalR e il client Web sono stati creati e testati, sarà necessario distribuirli su un server IIS locale
  • Nel mio caso, ho intenzione di utilizzare un vecchio laptop con Windows 7 con IIS sulla mia rete domestica

NOTA

Tutte le istruzioni sono applicabili alla versione Python 2.7.x. La versione 3.0 potrebbe richiedere riscritture

Passaggio 4: il database di SQL Server

Il database di SQL Server
Il database di SQL Server

Lo schema allegato mostra la struttura di un database SQL Server di base utilizzato in questa applicazione e contiene solo due tabelle.

Tabella AutoHubCode

Le due colonne importanti di questa tabella sono:

AutoCodeKey: memorizza il nome intuitivo della chiave Code

Ciascuna delle chiavi di codice viene trasmessa da un client di automazione - nel nostro caso, un pulsante HTML da una pagina Web

AutoCodeVal: memorizza la sequenza del codice IR grezzo

Questo è il codice IR effettivo che viene ritrasmesso al client in risposta dall'hub SignalR

In questo caso un client Python in costante comunicazione con l'Hub riceve la sequenza del codice IR e la trasmette tramite Porta Seriale all'Arduino UNO

Tabella AutoHubLog

  • Registra il codice richiesto dal client di automazione.
  • Questa è una misura per tenere traccia di chi e quando ha utilizzato il sistema e quale codice è stato richiesto

Come accennato, ho utilizzato SQL Server 2012 come piattaforma di database preferita. Puoi ricreare questo semplice design su una piattaforma di database diversa come MySQL, Oracle, ecc.

Tuttavia, lo script SQL per creare questo database è stato allegato qui

NOTA

  1. Il codice per l'hub di SignalR è progettato per connettersi a un database di SQL Server 2012
  2. Lavorare con un database diverso significherebbe modificare l'hub per utilizzare un driver di database diverso

Passaggio 5: l'applicazione Web ASP. NET SignalR Hub

L'applicazione Web dell'hub di ASP. NET SignalR
L'applicazione Web dell'hub di ASP. NET SignalR
L'applicazione Web dell'hub di ASP. NET SignalR
L'applicazione Web dell'hub di ASP. NET SignalR

L'applicazione Web ASP. NET SignalR Hub comprende congiuntamente i seguenti componenti come indicato nello schema allegato:

Sezione 1 - L'hub SignalR che riceve le richieste e risponde al client

Sezioni 2, 4 - La pagina web del client HTML e il suo foglio di stile che collettivamente formano il front-end del sistema di automazione e inviano comandi all'hub di automazione

Sezione 3 - Le API jQuery SignalR utilizzate dal client HTML per comunicare con Automation Hub

Sezione 5 - L'hub SignalR non comunica direttamente al database. Lo fa tramite classi intermedie generate utilizzando Entity Framework

Queste classi astraggono i dettagli del database dall'applicazione front-end

Sezione 6 - La classe del servizio Database che aiuta a eseguire le operazioni di lettura-scrittura sul database SQL (descritte in precedenza) utilizzando le classi Entity Framework

ASP. NET e SignalR sono tecnologie Microsoft e questa esercitazione ti illustrerà come creare e distribuire una semplice applicazione SignalR.

Quello che ho costruito qui si basa sulle nozioni di base acquisite da questo tutorial. Una volta distribuita, l'applicazione dovrebbe essere simile alla pagina Web mostrata nella seconda immagine

NOTA SUL CODICE

È stato allegato un file ZIP contenente una versione ridotta del codice

La struttura delle cartelle è come mostrato nell'immagine, tuttavia, tutte le classi del framework e gli script jQuery sono stati rimossi per ridurre le dimensioni dell'allegato

Si consiglia di utilizzare questo codice come guida perché quando si crea una nuova applicazione Web SignalR seguendo il collegamento all'esercitazione precedente, verranno aggiunte automaticamente le librerie jQuery più recenti e le classi di framework ASP. NET

Inoltre, i riferimenti agli script jQuery nella pagina index.html dovranno essere modificati per riflettere la versione più recente delle librerie client jQuery SignalR che verranno aggiunte automaticamente quando si compila l'applicazione Web.

Infine, la stringa di connessione dovrà essere modificata in modo che corrisponda al database nei file denominati come Web.config*

Passaggio 6: il client del servizio Python SignalR

Il client del servizio Python SignalR
Il client del servizio Python SignalR

Mentre il client HTML SignalR è un'interfaccia utente frontale, il client Python è un'applicazione di servizio di back-end la cui funzione principale è ricevere il codice IR trasmesso dall'hub e instradarlo ad Arduino UNO tramite comunicazione seriale.

Il codice allegato è autoesplicativo ed è sufficientemente documentato per descriverne la funzionalità

Come mostrato nella schermata composita, il client HTML e il client del servizio Python comunicano tramite l'hub SignalR come segue:

  1. L'utente del sistema di automazione invia un comando all'Hub tramite un clic del pulsante
  2. Ogni pulsante è associato al codice IR Key e quando viene cliccato, questo codice viene trasmesso all'Hub
  3. L'Hub riceve questo codice, si connette al database e recupera il codice del segnale IR grezzo e lo ritrasmette a tutti i client connessi

    Allo stesso tempo, l'Hub registra una voce nella tabella del database AutoHubLog registrando il codice e la data e l'ora in cui è stata richiesta dai client remoti

  4. Il client del servizio Python riceve il codice IR e lo inoltra ad Arduino UNO per ulteriori elaborazioni

Passaggio 7: schizzo e codice di trasmissione IR Arduino UNO

Lo schizzo e il codice della trasmissione IR Arduino UNO
Lo schizzo e il codice della trasmissione IR Arduino UNO
Lo schizzo e il codice della trasmissione IR Arduino UNO
Lo schizzo e il codice della trasmissione IR Arduino UNO
Lo schizzo e il codice della trasmissione IR Arduino UNO
Lo schizzo e il codice della trasmissione IR Arduino UNO

Il circuito Arduino come mostrato nelle immagini è piuttosto semplice per questo sistema ed è quindi descritto brevemente:

  • Il LED IR incolore deve essere cablato al PIN digitale 3 dell'UNO - questo è un requisito della libreria IRLib Arduino
  • Le ragioni sono descritte nel mio precedente IBLE sulla clonazione di un telecomando nella sezione relativa alla libreria IRLib
  • Il LED verde collegato al PIN digitale 4 è un indicatore visivo che si accende quando l'UNO ha ricevuto tutte le sezioni del codice IR dal client Python in esecuzione sul Raspberry Pi.
  • L'accensione di questo LED confermerà che la comunicazione seriale tra Raspberry Pi e UNO funziona
  • Per abilitare la comunicazione seriale, l'UNO è collegato al Raspberry Pi tramite la porta USB
  • L'allegato Arduino Sketch è sufficientemente commentato per descriverne la funzione
  • I commenti all'inizio del codice descrivono anche come deve essere cablato il circuito

NOTA

In pratica, l'Arduino e il Pi potrebbero essere collegati congiuntamente a un hub USB alimentato abbastanza forte da pilotare il Pi, l'Arduino e trasmettere anche un segnale forte tramite il LED IR

Passaggio 8: collegamento e test del sistema

Collegamento e test del sistema
Collegamento e test del sistema
Collegamento e test del sistema
Collegamento e test del sistema
Collegamento e test del sistema
Collegamento e test del sistema
  1. Crea e distribuisci l'hub ASP. NET SignalR, il client HTML insieme al database SQL Server 2012 in un Internet Information Server (IIS) sulla rete domestica locale
  2. Accedi all'applicazione web aprendo il client HTML SignalR su

    l'URL di questa pagina sarebbe in genere

  3. Fare clic su un pulsante sul pannello di controllo e, se l'applicazione è stata distribuita correttamente, l'Hub risponderà restituendo il codice IR e visualizzandolo nel pannello grigio adiacente al pannello di controllo

    Ricordare! Dovrai caricare i codici nel tuo database impostando la libreria del ricevitore IR e catturando i codici come descritto nel mio precedente IBLE

  4. Collega l'Arduino al Raspberry Pi tramite USB: apri l'IDE Arduino sul Pi e assicurati che l'UNO possa stabilire una connessione con il Pi

    questi articoli tutorial di Arduino dovrebbero aiutarti a raggiungere questo obiettivo abbastanza rapidamente

  5. Apri il codice Python e apporta le seguenti modifiche applicabili al tuo ambiente

    • l'indirizzo della porta seriale del tuo UNO come acquisito dal passaggio 4
    • l'URL dell'hub SignalR in modo che corrisponda all'URL locale del passaggio 2: in questo esempio sarebbe
  6. Infine, apri Arduino Sketch nell'IDE Arduino sul Raspberry Pi e esegui il flashing su UNO
  7. Posizionare la breadboard che tiene il circuito in prossimità dell'apparecchio da controllare - il LED IR deve avere una linea di visione chiara con la porta del ricevitore IR dell'apparecchio
  8. Avvia il programma Python sul Raspberry Pi premendo il pulsante F5 sulla barra degli strumenti Python IDLE
  9. Torna al Pannello di controllo del programma client HTML (passaggio 2) e fai clic su un pulsante (come Accensione o Aumento volume)

Se il sistema è stato configurato correttamente, dovresti essere in grado di visualizzare la pagina del client HTML sul tuo telefono o tablet e controllare l'appliance con i pulsanti sulla pagina del client HTML.

Passaggio 9: il sistema in azione

Il sistema in azione
Il sistema in azione
Il sistema in azione
Il sistema in azione
Il sistema in azione
Il sistema in azione
Il sistema in azione
Il sistema in azione

Le immagini sopra mostrano il sistema di automazione domestica in azione una volta configurato.

Da quando ho pubblicato questo IBLE, ho esteso l'interfaccia acquisendo alcuni codici IR dalla mia TV LED VIZIO

Come mostrato fianco a fianco con il telecomando TV di fabbrica nella prima immagine, alcune funzioni essenziali di questo telecomando sono state integrate nell'interfaccia utente Web accessibile tramite il mio tablet

Le immagini successive mostrano il tablet in primo piano con la TV nella parte posteriore che risponde ai comandi emessi dall'interfaccia Web:

  1. Comando di spegnimento - Il televisore si spegne
  2. Comando di accensione: il televisore si accende e il logo "V" appare quando lo schermo si accende
  3. Comando Mute ON - Viene visualizzata una barra orizzontale con l'altoparlante disattivato

In tutti i test, l'area grigia a fianco del cruscotto sullo schermo del tablet visualizza il comando impartito dal client e la risposta inviata dall'hub remoto SignalR

Passaggio 10: miglioramento del sistema di automazione e correzioni correlate

Questo sistema può essere esteso aggiungendo più codici acquisiti da sistemi diversi. Sebbene questa parte sia facile, ci sono altri due fattori che dovrai prendere in considerazione.

Miglioramento 1 (rapido): lavorare con segnali IR di diverse lunghezze

  1. I codici IR di sistemi diversi hanno lunghezze diverse, anche tra due prodotti dello stesso produttore.

    Ad esempio, in questo caso, la lunghezza dell'array di codici IR per la TV LED è 67 mentre quella della Sound Bar Samsung è circa 87

  2. Ciò significa che, se accendessi prima la soundbar, l'array IR Buffer nello sketch Arduino verrebbe riempito con una sequenza di codici IR che contiene 87 codici
  3. In seguito, se accendessi la TV LED, riempirebbe l'array IR Buffer con solo 67 codici, ma i restanti 20 codici dell'operazione precedente sarebbero ancora in giro

Il risultato? La TV LED non si accende perché il buffer del codice IR è stato corrotto dai 20 codici extra non ripuliti dall'operazione precedente!

Fix 1 (la via d'uscita facile, non consigliata)

Modifica lo schizzo Arduino come segue:

Modifica le seguenti chiamate di funzione nella funzione loop(){}

trasmettitoreIRCode();

trasmettereIRCode(c);

Apportare modifiche alla firma della funzione di cui sopra:

void translateIRCode(int codeLen){ // Costante RAWBUF sostituita con codeLen IRTransmitter. IRSendRaw::send(IRCodeBuffer, codeLen, 38); }

Anche se questo è facile, l'array non viene mai completamente cancellato e quindi questa non è una soluzione molto pulita

Fix 2 (non difficile, consigliato)

Dichiara una variabile aggiuntiva nella parte superiore di Arduino Sketch, dopo la sezione dei commenti:

unsigned int EMPTY_INT_VALUE;

Aggiungi questo all'inizio della funzione setup():

//Cattura lo stato naturale di un intero vuoto senza segno variabileEMPTY_INT_VALUE = IRCodeBuffer[0];

Scorri verso il basso e aggiungi una nuova funzione allo schizzo subito dopo la funzione translateIRCode():

void clearIRCodeBuffer(int codeLen){//Cancella tutti i codici dall'array//NOTA: impostare gli elementi dell'array su 0 non è la soluzione!for(int i=1;i<=codeLen;i++){IRCodeBuffer[i-1]=EMPTY_INT_VALUE;}}

Infine, chiama la nuova funzione sopra nella seguente posizione nella funzione loop():

//Reset - Riprendi la lettura Serial PortclearIRCodeBuffer(c);…

Questo è un approccio più pulito in quanto ripristina effettivamente tutte le posizioni nell'array IR Buffer che sono state popolate dal segnale del codice IR più recente senza lasciare nulla al caso.

Miglioramento 2 (più coinvolto): ripetizione della trasmissione del segnale IR per alcuni dispositivi

Alcuni dispositivi richiedono che lo stesso segnale venga trasmesso più volte per rispondere Esempio: in questo caso, la Samsung Sound Bar richiede che lo stesso codice venga inviato due volte con un intervallo di 1 secondo

Il Fix in Concept è stato discusso qui in quanto è un po' più complesso e necessita di test

L'aggiunta della funzionalità di ripetizione all'Ardunio Sketch significherà che dovrai eseguire il flashing dello Sketch ogni volta che aggiungi un nuovo dispositivo al tuo sistema di automazione domestica

Invece, l'aggiunta di questa correzione al client HTML SignalR e all'applicazione Python SignalR Service rende la soluzione molto più flessibile. E questo potrebbe essere ottenuto in linea di principio come segue:

Modificare il client HTML SignalR per trasmettere informazioni ripetute all'hub

Apri index.html e incorpora il valore di ripetizione nel pulsante HTML in questo modo:

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

Dove, 2 è il valore di ripetizione e 1000 è il valore di ritardo in millisecondi tra i due segnali di ripetizione

Quando si fa clic su questo pulsante, l'hub SignalR riceverà il codice chiave+Repeat_Spec

Modificare i metodi lato server di SignalR per analizzare solo il codice chiave:

  • Usa il codice chiave per recuperare il codice IR dal database come al solito
  • Trasmettere il Key Code+Repeat_Spec e l'IRCode ai Client SingalR come di consueto

Modificare l'applicazione del servizio Python SignalR per trasmettere segnali utilizzando i valori di ripetizione:

Apri il client Python e modifica le seguenti due funzioni:

def print_command_from_hub(buttonId, cmdSrc):

# analizza il codice di ripetizione dal valore buttonId

def sendToArduino(IRSignalCode, delim, endPrefix):

# impostare un tempo o un loop per trasmettere il segnale alla frequenza desiderata

  • In questo modo, Arduino non deve essere lampeggiato ripetutamente
  • In questo sistema può essere integrato un numero qualsiasi di frequenze ripetute
  • Inoltre, se stai usando l'UNO, c'è un limite alle dimensioni che il tuo Sketch può raggiungere!

Passaggio 11: problemi noti e problemi di sicurezza

Come nel caso dei sistemi costruiti per la prima volta, questo ha un paio di problemi emersi durante i test.

Problema 1: l'attivazione di comandi in rapida successione con ritardi inferiori a un secondo tra i clic dei pulsanti ha causato la mancata risposta del sistema dopo aver risposto per le prime due volte.

  • Il riavvio del client Python SignalR ripristina il sistema alle normali operazioni
  • Le risoluzioni immediate possono essere quelle di rimuovere gli output di debug indesiderati in entrambi, il client Python SignalR e anche in Arduino Sketch e ripetere questi test
  • Un altro punto da esaminare sarebbe la comunicazione seriale stessa: sarebbe possibile aggiungere codice per svuotare rapidamente il buffer?

Detto questo, ho notato che la mia TV non risponde bene al telecomando di fabbrica, quindi anche la natura stessa della comunicazione IR della mia TV potrebbe essere un fattore che contribuisce.

Problema 2: lo schermo HTML smette di rispondere ai clic sui pulsanti dopo un lungo periodo di inattività

Di solito l'aggiornamento della pagina risolve questo comportamento, ma la causa di questo comportamento non è ancora chiara

PROBLEMI DI SICUREZZA

Questo sistema è stato progettato esclusivamente per l'uso in rete locale (domestica) e non dispone delle necessarie misure di sicurezza per l'utilizzo su Internet

Pertanto è consigliabile distribuire l'hub SignalR in un computer locale nella rete locale/domestica

Grazie per aver letto il mio IBLE e spero che ti diverta!

Consigliato: