Indholdsfortegnelse:

Raspberry Pi-Arduino-SignalR Home Automation Hub: 11 trin (med billeder)
Raspberry Pi-Arduino-SignalR Home Automation Hub: 11 trin (med billeder)

Video: Raspberry Pi-Arduino-SignalR Home Automation Hub: 11 trin (med billeder)

Video: Raspberry Pi-Arduino-SignalR Home Automation Hub: 11 trin (med billeder)
Video: 2018-11-20 Learning SignalR - Home Automation with .NET Core and Hubitat 2024, Juli
Anonim
Raspberry Pi-Arduino-SignalR Home Automation Hub
Raspberry Pi-Arduino-SignalR Home Automation Hub

Efter et par af mine optakt IBLE'er, der blev offentliggjort her og her, tager dette projekt det første skridt mod at opbygge en grundlæggende version af en funktionel Home Automation Hub.

Jeg har brugt flere forskellige teknologier i et forsøg på at give mening om, hvordan jeg kan være i stand til at bruge alle de ting, jeg har lært tidligere og de nye ting, som jeg fortsætter med at lære, efterhånden som dage skrider frem.

Derfor består denne Automation Hub af følgende komponenter:

En SQL Server 2012 -database, der:

  • gemmer en liste over forudbestemte infrarøde (IR) koder i en tabel sammen med en unik "kode nøgle"
  • kodetasterne navngives intuitivt (af brugeren) for at identificere formålet med deres tilknyttede IR -koder

En ASP. NET SignalR Hub-webapplikation i realtid, der:

  • venter og modtager "kodenøgler" som kommandoer fra en bruger, der vender HTML -klient
  • når den modtages, opretter forbindelse til SQL -databasen og henter en IR -kode ved hjælp af den medfølgende kodenøgle
  • videresender den hentede IR -kode til en Python SignalR -klient

En bruger, der står over for HTML SignalR Dashboard -klient, der:

  • kommunikerer en unik kodenøgle til hubben via jQuery SignalR Client API'erne
  • hver knap på instrumentbrættet repræsenterer en unik kodenøgle, der er registreret i SQL -databasetabellen

En Python SignalR -baggrundstjeneste -applikation, der kører på Raspberry Pi 2.0, der:

  • modtager IR -koder som kommandoer fra hubben
  • opsøger afgrænsere i IR -koden og opdeler den meget lange kode i segmenter
  • kommunikerer over seriel port til Arduino og skriver hvert segment efter hinanden

En Arduino IR -senderskitse, der:

  • venter og modtager hvert af IR -kodesegmenterne over den serielle port
  • samler kodesegmenterne til et IR -kodebuffermatrix
  • pakker bufferen ind i en en IR Transmit -kommando ved hjælp af IRLib Arduino -biblioteket

Hvis målapparatet er i nærheden af IR -senderen, kan apparatet (måske) reagere på det IR -signal, der sendes af Arduino

BEMÆRK

Selvom målapparatet, jeg bruger i denne demonstration, reagerer på IR -signaler, kan du læse dette afsnit af min anden IBLE af grunde til, at jeg siger, at apparatet (kan) reagere på IR -signalet.

Tid til at rulle.

Trin 1: Hvad du har brug for, før hvad du har brug for

Hvad du har brug for, før hvad du har brug for
Hvad du har brug for, før hvad du har brug for
Hvad du har brug for, før hvad du har brug for
Hvad du har brug for, før hvad du har brug for
Hvad du har brug for, før hvad du har brug for
Hvad du har brug for, før hvad du har brug for

Dette instruerbare tager fart med noget af det tidligere udførte arbejde, hvilket også resulterede i min sidste IBLE.

Så før vi går ind i, hvad vi har brug for til denne IBLE, anbefales det, at du læser denne instruktive for lidt baggrund om, hvordan:

  1. Arduino IRLib infrarøde bibliotek blev oprettet
  2. Hvordan IR -koder, der blev brugt i denne IBLE, blev fanget ved hjælp af en IR -modtager
  3. Hvordan de indfangede IR -koder blev brugt til at styre målapparatet via en IR -sender

Efter afslutningen af denne IBLE implementerede jeg en ASP. NET IR Code Recorder webapplikation, der ville:

  • Accepter den indfangede IR -kode sammen med en intuitivt navngivet kodenøgle som input via en webformular
  • Opdel den meget lange IR -kode i segmenter, der er mindre end 64 tegn lange for at blive under den serielle buffergrænse for Arduino Uno
  • Det sidste segment af koder ville være forudfastsat med et "E", der angiver for Arduino, at det har modtaget det sidste segment af kode
  • Hvert segment ville blive adskilt af en rørafgrænser, før det blev samlet tilbage i en lang snor
  • Endelig blev den segmenterede IR -kode sammen med dens kodenøgle gemt i en SQL Server 2012 -database

Det er denne SQL -database, der danner en af komponenterne i Home Automation Hub, der er uddybet i denne IBLE.

BEMÆRK

IR -kodeoptager -webapplikationen udgør ikke en del af diskussionen her af følgende årsager:

  • Du kan manuelt fange koder ved hjælp af Arduino Sketch, opdele dem i rørafgrænsede sektioner og gemme dem i databasen uden at skulle bygge en udførlig webapplikation
  • I modsætning til denne IBLE fokuserer IR -optageren på omvendt kommunikation fra Arduino til Raspberry Pi

Derfor vil detaljer om dette projekt være et emne for en anden IBLE

Trin 2: Hvad du har brug for - hardware

Hvad du har brug for - hardware
Hvad du har brug for - hardware
Hvad du har brug for - hardware
Hvad du har brug for - hardware

En fungerende Raspberry Pi 2.0 - Jeg anbefaler at installere Ubuntu Mate, da den har et rigere sæt funktioner, herunder OpenLibre Office, som i øvrigt var uundværlig for at dokumentere dette instruerbare, lige der på Raspberry Pi.

Derudover har Pi brug for følgende eksterne:

  • Arduino Uno prototypeplatform eller en klon
  • En IR -sender LED - jeg brugte et mærke ved navn Three Legs fra Amazon.com
  • 330 eller en 220 Ohm modstande-jeg brugte 220 (farvekode rød-rød-brun), fordi jeg havde flere handy
  • Det sædvanlige brødbræt, stik og en pc med Arduino -miljøet installeret
  • En testkandidat - såsom den allestedsnærværende Samsung LED -skærm med en fjernbetjening

Trin 3: Hvad du har brug for - softwaren

For at få alle brikkerne samlet skal følgende softwareopsætning installeres og køre:

På Raspberry Pi skal du installere følgende:

  • Arduino IDE - bruges til at bygge skitsen og flash den til UNO
  • Python -modulet til Arduino - til seriel kommunikation mellem UNO og Pi
  • Python SignalR -klientbiblioteket - Du kan henvise til instruktionerne vedhæftet her

En Windows -maskine med følgende udviklingsmiljø installeret:

  • Gratis udgave af Microsoft Visual Studio Express 2013 til opbygning af SignalR Hub og webklientprogram
  • Gratis udgave af SQL Server 2012 Express til at designe og opbygge backenddatabasen

Et Windows Internet Information Server (IIS) hosting -miljø:

  • Når SignalR Hub og webklient er bygget og testet, skal den installeres til en lokal IIS -server
  • I mit tilfælde planlægger jeg at bruge en gammel bærbar computer, der kører Windows 7 med IIS på mit hjemmenetværk

BEMÆRK

Alle instruktioner gælder for Python 2.7.x -versionen. Version 3.0 kan kræve omskrivninger

Trin 4: SQL Server Database

SQL Server Database
SQL Server Database

Den vedlagte skematisk viser strukturen af en grundlæggende SQL Server -database, der bruges i dette program, og indeholder kun to tabeller.

Tabel AutoHubCode

De to vigtige kolonner i denne tabel er:

AutoCodeKey - gemmer det brugervenlige navn på kodenøglen

Hver af kodetasterne transmitteres af en automatiseringsklient - i vores tilfælde en HTML -knap fra en webside

AutoCodeVal - gemmer den rå IR -kodesekvens

Dette er den faktiske IR -kode, der sendes tilbage til klienten som svar fra SignalR Hub

I dette tilfælde modtager en Python -klient i konstant kommunikation til hubben IR -kodesekvensen og sender den over seriel port til Arduino UNO

Tabel AutoHubLog

  • Logger koden, der anmodes om af automatiseringsklienten.
  • Dette er et mål for at spore, hvem og hvornår der blev brugt systemet, og hvilken kode der blev anmodet om

Som nævnt har jeg brugt SQL Server 2012 som min foretrukne database platform. Du kan genskabe dette enkle design på en anden databaseplatform som MySQL, Oracle osv.

Ikke desto mindre er SQL Script til oprettelse af denne database blevet vedhæftet her

BEMÆRK

  1. Koden til SignalR Hub er designet til at oprette forbindelse til en SQL Server 2012 -database
  2. Arbejde med en anden database ville betyde ændring af Hub til at bruge en anden database driver

Trin 5: ASP. NET SignalR Hub -webapplikationen

ASP. NET SignalR Hub -webapplikationen
ASP. NET SignalR Hub -webapplikationen
ASP. NET SignalR Hub -webapplikationen
ASP. NET SignalR Hub -webapplikationen

ASP. NET SignalR Hub -webapplikationen består i fællesskab af følgende komponenter som angivet i vedlagte skematisk:

Afsnit 1 - SignalR Hub, der modtager anmodninger fra og reagerer på klienten

Afsnit 2, 4 - HTML -klientwebsiden og dens typografiark, der samlet danner forenden af automatiseringssystemet og udsender kommandoer til Automation Hub

Afsnit 3 - jQuery SignalR API'erne, der bruges af HTML -klienten til at kommunikere til Automation Hub

Afsnit 5 - SignalR Hub kommunikerer ikke direkte til databasen. Det gør det via mellemklasser genereret ved hjælp af Entity Framework

Disse klasser abstraherer databasedetaljerne fra frontend -applikationen

Afsnit 6 - Databasetjenesteklassen, der hjælper med at udføre Read -Write -operationerne på SQL Database (beskrevet tidligere) ved hjælp af Entity Framework -klasser

ASP. NET og SignalR er Microsoft -teknologier, og denne vejledning vil guide dig igennem, hvordan en simpel SignalR -applikation er bygget og implementeret.

Det, jeg har bygget her, er baseret på det grundlæggende erhvervet fra denne vejledning. Når den er implementeret, skal applikationen ligne websiden vist på det andet billede

BEMÆRK PÅ KODEN

En ZIP -fil, der indeholder en fjernet version af koden, er vedhæftet

Mappestrukturen er som vist i det visuelle - dog er alle rammeklasser og jQuery -scripts blevet fjernet for at reducere størrelsen på den vedhæftede fil

Anbefalingen er, at denne kode bruges som en vejledning, fordi når du opretter en ny SignalR -webapplikation ved at følge tutorials -linket ovenfor, tilføjes de nyeste jQuery -biblioteker og ASP. NET -rammeklasser automatisk

Henvisningerne til jQuery -scripts på index.html -siden skal også ændres, så de afspejler den nyeste version af jQuery SignalR -klientbibliotekerne, der automatisk tilføjes, når du bygger dit webprogram.

Endelig skal forbindelsesstrengen ændres for at matche din database i filerne navngivet som Web.config*

Trin 6: Python SignalR Service Client

Python SignalR Service Client
Python SignalR Service Client

Mens HTML SignalR -klienten er en frontvendt brugergrænseflade, er Python -klienten et back -end -serviceprogram, hvis hovedfunktion er at modtage IR -koden, der transmitteres af hubben og dirigere den til Arduino UNO over seriel kommunikation.

Den vedhæftede kode er selvforklarende og er dokumenteret nok til at beskrive dens funktionalitet

Som vist i det sammensatte skærmbillede kommunikerer HTML -klienten og Python Service -klienten via SignalR Hub som følger:

  1. Brugeren af automatiseringssystemet udsteder en kommando til hubben via et klik på knappen
  2. Hver knap er knyttet til IR -nøglekoden, og når der klikkes på den, overføres denne kode til hubben
  3. Hub modtager denne kode, opretter forbindelse til databasen og henter den rå IR -signalkode og sender den tilbage til alle tilsluttede klienter

    Samtidig logger hubben en post i AutoHubLog -databasetabellen, der registrerer koden og den dato og klokkeslæt, den blev anmodet om af eksterne klienter

  4. Python -serviceklienten modtager IR -koden og videresender den til Arduino UNO for videre behandling

Trin 7: Arduino UNO IR -transmissionsskitse og kode

Arduino UNO IR -transmissionsskitse og kode
Arduino UNO IR -transmissionsskitse og kode
Arduino UNO IR -transmissionsskitse og kode
Arduino UNO IR -transmissionsskitse og kode
Arduino UNO IR -transmissionsskitse og kode
Arduino UNO IR -transmissionsskitse og kode

Arduino -kredsløbet som vist i visualerne er ret simpelt for dette system og beskrives derfor kort:

  • Den farveløse IR -LED skal forbindes til Digital PIN 3 på UNO - dette er et krav fra IRLib Arduino -biblioteket
  • Årsagerne er beskrevet i min tidligere IBLE om kloning af en fjernbetjening i afsnittet relateret til IRLib -biblioteket
  • Den grønne LED tilsluttet Digital PIN 4 er en visuel indikator, der lyser, når UNO har modtaget alle sektioner af IR -koden fra Python -klienten, der kører på Raspberry Pi.
  • Når denne LED lyser, bekræftes det, at den serielle kommunikation mellem Raspberry Pi og UNO fungerer
  • For at aktivere seriel kommunikation er UNO forbundet til Raspberry Pi via USB -porten
  • Den vedhæftede Arduino Sketch er kommenteret tilstrækkeligt til at beskrive dens funktion
  • Kommentarerne øverst i koden beskriver også, hvordan kredsløbet skal forbindes

BEMÆRK

I praksis kunne Arduino og Pi i fællesskab forbindes til en drevet USB -hub, der er stærk nok til at drive Pi, Arduino og også sende et stærkt signal via IR LED

Trin 8: Tilslutning og test af systemet

Tilslutning og test af systemet
Tilslutning og test af systemet
Tilslutning og test af systemet
Tilslutning og test af systemet
Tilslutning og test af systemet
Tilslutning og test af systemet
  1. Byg og implementer ASP. NET SignalR Hub, HTML -klienten sammen med SQL Server 2012 -databasen til en Internet Information Server (IIS) på dit lokale hjemmenetværk
  2. Få adgang til webprogrammet ved at åbne HTML SignalR -klienten via

    URL'en til denne side ville typisk være https:// yourComputer: port_number/

  3. Klik på en knap på kontrolpanelet, og hvis applikationen er blevet installeret korrekt, reagerer hubben ved at returnere IR -koden og vise den i det grå panel, der støder op til kontrolpanelet

    Husk! Du bliver nødt til at indlæse koderne i din database ved at konfigurere IR -modtagerbiblioteket og fange koderne som beskrevet i min tidligere IBLE

  4. Tilslut Arduino til Raspberry Pi over USB - åbn Arduino IDE på Pi og sørg for, at UNO kan oprette forbindelse til Pi

    disse Arduino tutorial artikler skulle hjælpe dig med at komme til dette temmelig hurtigt

  5. Åbn Python -koden, og foretag følgende ændringer, som er relevante for dit miljø

    • den serielle portadresse for din UNO som erhvervet fra trin 4
    • URL'en til SignalR -hub'en, der matcher din lokale URL fra trin 2 - i dette eksempel ville det være https:// yourComputer: port_number/signalr
  6. Endelig skal du åbne Arduino Sketch i Arduino IDE på Raspberry Pi og flash den til UNO
  7. Placer brødbrættet, der holder kredsløbet i nærheden af det apparat, der skal kontrolleres - IR -LED'en skal have en klar synslinje med apparatets IR -modtagerport
  8. Start Python -programmet på Raspberry Pi ved at trykke på F5 -knappen på Python IDLE -værktøjslinjen
  9. Vend tilbage til kontrolpanelet i HTML -klientprogrammet (trin 2), og klik på en knap (f.eks. Tænd eller Lydstyrke op)

Hvis systemet er konfigureret korrekt, skal du være i stand til at hente HTML -klientsiden på din telefon eller tablet og styre dit apparat med knapperne på din HTML -klientside.

Trin 9: Systemet i aktion

Systemet i aktion
Systemet i aktion
Systemet i aktion
Systemet i aktion
Systemet i aktion
Systemet i aktion
Systemet i aktion
Systemet i aktion

Billederne ovenfor viser hjemmeautomatiseringssystemet i aktion, når det er konfigureret.

Siden udgivelsen af denne IBLE har jeg udvidet grænsefladen ved at fange et par IR -koder fra mit VIZIO LED -tv

Som vist side om side med fabriks -tv -fjernbetjeningen i det første billede, er der få væsentlige funktioner i denne fjernbetjening blevet indbygget i web -brugergrænsefladen, der er tilgængelig via min tablet

Efterfølgende billeder viser tabletten i forgrunden med fjernsynet i ryggen, der reagerer på kommandoer fra webgrænsefladen:

  1. Sluk -kommando - TV'et slukker
  2. Tænd -kommando - TV'et tændes, og "V" -logoet vises, når skærmen tændes
  3. Mute ON -kommando - En vandret bjælke kommer op med højttaleren slået fra

I alle testene viser det grå område ved siden af instrumentbrættet på tabletskærmen kommandoen, der er udstedt af klienten, og svaret sendt tilbage af den eksterne SignalR Hub

Trin 10: Forbedring af automatiseringssystemet og relaterede rettelser

Dette system kan udvides ved at tilføje flere koder hentet fra forskellige systemer. Selvom denne del er let, er der to andre faktorer, du skal tage i betragtning.

Enhancement 1 (Quick): Arbejde med IR -signaler i forskellige længder

  1. IR -koder for forskellige systemer har forskellige længder, selv mellem to produkter fra den samme producent.

    For eksempel er IR -kodearraylængden for LED -tv'et i dette tilfælde 67, mens Samsung Sound Bar er omkring 87

  2. Hvilket betyder, at hvis jeg tænder for Sound Bar først, ville IR Buffer -arrayet i Arduino -skitsen blive fyldt med en IR -kodesekvens, der indeholder 87 koder
  3. Efter dette, hvis jeg tændte LED -tv'et, ville det fylde IR Buffer -arrayet med kun 67 koder, men de resterende 20 koder fra den tidligere operation ville stadig være omkring

Resultatet? LED -tv'et tændes ikke, fordi IR -kodebufferen er blevet ødelagt af de ekstra 20 koder, der ikke er ryddet op fra den tidligere operation!

Fix 1 (den lette vej ud, anbefales ikke)

Ændre Arduino Sketch som følger:

Skift følgende funktionsopkald i funktionen loop () {}

transmitIRCode ();

at transmittereIRCode (c);

Foretag ændringer af signaturen til ovenstående funktion:

void transmitIRCode (int codeLen) {// RAWBUF konstant erstattet med codeLen IRTransmitter. IRSendRaw:: send (IRCodeBuffer, codeLen, 38); }

Selvom dette er let, bliver arrayet aldrig rigtigt helt ryddet, og derfor er dette ikke en meget ren løsning

Fix 2 (ikke svært, anbefales)

Angiv en ekstra variabel helt øverst på Arduino Sketch efter kommentarfeltet:

usigneret int EMPTY_INT_VALUE;

Tilføj dette til toppen af opsætningsfunktionen ():

// Fang den naturlige tilstand af en tom usigneret heltalsvariabelEMPTY_INT_VALUE = IRCodeBuffer [0];

Rul ned og tilføj en ny funktion til skitsen umiddelbart efter funktionen transmitIRCode ():

void clearIRCodeBuffer (int codeLen) {// Ryd alle koder fra array // BEMÆRK: at indstille array-elementer til 0 er ikke løsningen! for (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = EMPTY_INT_VALUE;}}

Til sidst skal du ringe til ny funktion ovenfor på følgende sted i loop () -funktionen:

// Nulstil - Genoptag læsning Serial PortclearIRCodeBuffer (c); …

Dette er en mere renere tilgang, da den faktisk nulstiller alle de placeringer i IR Buffer -arrayet, der blev befolket af det seneste IR -kodesignal uden at overlade noget til tilfældighederne.

Enhancement 2 (mere involveret): Gentagen IR -signaltransmission for visse enheder

Nogle enheder kræver, at det samme signal overføres flere gange for at reagere Eksempel: I dette tilfælde kræver Samsung Sound Bar, at den samme kode skal sendes to gange med et mellemrum på 1 sekund

Fix in Concept er blevet diskuteret her, da det er lidt mere involveret og skal testes

Tilføjelse af funktionen til gentagelse til Ardunio Sketch vil betyde, at du bliver nødt til at blinke skitsen, hver gang du tilføjer en ny enhed til dit hjemmeautomatiseringssystem

I stedet gør tilføjelsen af denne rettelse til HTML SignalR -klienten og Python SignalR Service -applikationen løsningen meget mere fleksibel. Og dette kunne i princippet opnås som følger:

Rediger SignalR HTML -klienten for at overføre gentagne oplysninger til hubben

Åbn index.html, og integrer gentagelsesværdien i HTML -knappen sådan:

value = "SMSNG-SB-PWR-ON" ville blive value = "SMSNG-SB-PWR-ON_2_1000"

Hvor, 2 er gentagelsesværdien og 1000 er forsinkelsesværdien i millisekunder mellem de to gentagelsessignaler

Når du klikker på denne knap, modtager SignalR -hub nøglekoden+Repeat_Spec

Rediger SignalR Server -sidemetoderne for kun at parse nøglekoden:

  • Brug nøglekoden til at hente IR -koden fra databasen som normalt
  • Overfør nøglekoden+Repeat_Spec og IRCoden til SingalR -klienterne som normalt

Rediger Python SignalR -serviceapplikationen for at transmittere signaler ved hjælp af gentagelsesværdierne:

Åbn Python -klienten, og rediger følgende to funktioner:

def print_command_from_hub (buttonId, cmdSrc):

# parse gentagelseskoden fra buttonId -værdien

def transmitToArduino (IRSignalCode, delim, endPrefix):

# opsæt et stykke tid eller for loop til at transmittere signalet med den ønskede frekvens

  • På denne måde behøver Arduino ikke at blive blinket gentagne gange
  • Et hvilket som helst antal gentagelsesfrekvenser kan indbygges i dette system
  • Desuden, hvis du bruger UNO, er der en grænse for størrelsen, din Skitse kan vokse til!

Trin 11: Kendte problemer og sikkerhedsproblemer

Som det er tilfældet med systemer, der blev bygget første gang, har denne et par problemer, der kom frem under testningen.

Problem 1: Affyring af kommandoer i hurtig rækkefølge med forsinkelser på mindre end et sekund mellem knapklik fik systemet til at reagere ikke efter at have reageret de første par gange.

  • Genstart af Python SignalR -klienten gendanner systemet tilbage til normal drift
  • Umiddelbare beslutninger kan være at fjerne uønskede Debug -output i både Python SignalR -klienten og også Arduino Sketch og gentage disse tests
  • Et andet sted at undersøge ville være selve seriel kommunikation - ville det være muligt at tilføje kode for hurtigt at skylle bufferen?

Når det er sagt, har jeg bemærket, at mit fjernsyn ikke reagerer godt på fabriksbetjeningen - derfor kan selve tv'ets IR -kommunikation også være en medvirkende faktor.

Problem 2: HTML -skærmen holder op med at reagere på knap klik efter en lang periode med inaktivitet

Normalt løser opdateringen af siden denne adfærd - årsagen til denne adfærd er dog stadig uklar

SIKKERHED BEMÆRK

Dette system er kun designet til lokal (hjemm) netværksbrug og har ikke de nødvendige sikkerhedsforanstaltninger til at kunne bruges over internettet

Derfor anbefales det, at SignalR Hub distribueres til en lokal maskine på dit lokale/hjemmenetværk

Tak fordi du læste min IBLE, og jeg håber du har det sjovt!

Anbefalede: