Obsah:

Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR: 11 kroků (s obrázky)
Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR: 11 kroků (s obrázky)

Video: Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR: 11 kroků (s obrázky)

Video: Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR: 11 kroků (s obrázky)
Video: PiHome Demo | Czech lang | OpenHAB | Raspberry Pi | Arduino | Domácí automatizace svépomocí 2024, Červenec
Anonim
Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR
Rozbočovač domácí automatizace Raspberry Pi-Arduino-SignalR

Po několika mých předešlých IBLE publikovaných zde a zde tento projekt dělá první krok k vybudování základní verze funkčního centra pro domácí automatizaci.

Použil jsem několik různých technologií, abych pochopil, jak budu moci využívat všechny věci, které jsem se v minulosti naučil, a nové věci, které se budu učit s postupem dnů.

Toto Automation Hub se tedy skládá z následujících komponent:

Databáze SQL Server 2012, která:

  • ukládá seznam předem určených infračervených (IR) kódů do tabulky spolu s jedinečným „kódovým klíčem“
  • kódové klíče jsou intuitivně pojmenovány (uživatelem), aby se identifikoval účel jejich přidružených IR kódů

Webová aplikace ASP. NET SignalR Hub v reálném čase, která:

  • čeká a přijímá „kódové klíče“jako příkazy od uživatele, který čelí HTML klientovi
  • po přijetí se připojí k databázi SQL a načte kód IR pomocí dodaného kódu
  • předá načtený IR kód klientovi Python SignalR

Uživatel čelící klientovi HTML SignalR Dashboard, který:

  • komunikuje jedinečný kódový klíč do Hubu prostřednictvím klientských rozhraní API jQuery SignalR
  • každé tlačítko na řídicím panelu bude představovat jedinečný kódový klíč zaznamenaný v tabulce databáze SQL

Aplikace na pozadí služby Python SignalR běžící na Raspberry Pi 2.0, která:

  • přijímá IR kódy jako příkazy z Hubu
  • vyhledá oddělovače v IR kódu a rozdělí velmi dlouhý kód na segmenty
  • komunikuje přes Arduino přes sériový port a postupně zapisuje každý segment

Skica Arduino IR vysílače, která:

  • čeká a obdrží každý ze segmentů IR kódu přes sériový port
  • sestavuje segmenty kódu do pole vyrovnávací paměti IR kódu
  • zabalí vyrovnávací paměť do příkazu IR Transmit pomocí knihovny IRLib Arduino

Pokud je cílové zařízení v blízkosti IR vysílače, pak zařízení (může) reagovat na IR signál vyslaný Arduinem

POZNÁMKA

Přestože cílové zařízení, které v této ukázce používám, reaguje na IR signály, možná si budete chtít přečíst tuto část mého dalšího IBLE z důvodů, proč říkám, že zařízení (může) reagovat na IR signál.

Čas válet se.

Krok 1: Co potřebujete, před tím, co potřebujete

Co potřebujete, před tím, co potřebujete
Co potřebujete, před tím, co potřebujete
Co potřebujete, před tím, co potřebujete
Co potřebujete, před tím, co potřebujete
Co potřebujete, před tím, co potřebujete
Co potřebujete, před tím, co potřebujete

Tento instruktážní start s některými z dříve provedených prací, které také vyústily v můj poslední IBLE.

Než tedy vstoupíme do toho, co pro tento IBLE potřebujeme, doporučujeme vám přečíst si tento návod a získat základní informace o tom, jak:

  1. Byla zřízena infračervená knihovna Arduino IRLib
  2. Jak byly IR kódy použité v tomto IBLE zachyceny pomocí IR přijímače
  3. Jak byly zachycené IR kódy použity k ovládání cílového zařízení pomocí IR vysílače

Po dokončení tohoto IBLE jsem nasadil webovou aplikaci ASP. NET IR Code Recorder, která by:

  • Přijměte zachycený IR kód spolu s intuitivně pojmenovaným kódovým klíčem jako vstupy prostřednictvím webového formuláře
  • Rozdělte velmi dlouhý IR kód na segmenty kratší než 64 znaků, abyste zůstali pod limitem sériové vyrovnávací paměti Arduino Uno
  • Poslední segment kódů bude předem zafixován „E“, které Arduinu indikuje, že obdržel poslední segment kódu
  • Každý segment by byl oddělen zpět oddělovačem trubek, než by byl sestaven zpět do dlouhého řetězce
  • Nakonec byl segmentovaný IR kód spolu s jeho kódovým klíčem uložen do databáze SQL Server 2012

Je to tato databáze SQL, která tvoří jednu ze součástí centra Home Automation Hub zpracovaného v tomto IBLE.

POZNÁMKA

Webová aplikace IR Code Recorder není součástí diskuse z následujících důvodů:

  • Kódy můžete ručně zachytit pomocí Arduino Sketch, rozdělit je na sekce oddělené potrubími a uložit je do databáze, aniž byste museli vytvářet propracovanou webovou aplikaci
  • Na rozdíl od tohoto IBLE se IR rekordér zaměřuje na zpětnou komunikaci z Arduina na Raspberry Pi

Podrobnosti o tomto projektu by proto byly tématem pro další IBLE

Krok 2: Co potřebujete - Hardware

Co potřebujete - hardware
Co potřebujete - hardware
Co potřebujete - hardware
Co potřebujete - hardware

Fungující Raspberry Pi 2.0 - doporučuji nainstalovat Ubuntu Mate, protože má bohatší sadu funkcí včetně OpenLibre Office, která byla mimochodem nepostradatelná při dokumentování tohoto pokynu, přímo na Raspberry Pi.

Kromě toho, Pi, budete potřebovat následující externí:

  • Prototypovací platforma Arduino Uno nebo klon
  • IR vysílač LED - použil jsem značku s názvem Three Legs od Amazon.com
  • Rezistory 330 nebo 220 ohmů-použil jsem 220 (barevný kód červeno-červeno-hnědý), protože jsem jich měl několik po ruce
  • Obvyklá chlebová deska, konektory a počítač s nainstalovaným prostředím Arduino
  • Testovací kandidát - například všudypřítomný Samsung LED monitor s dálkovým ovládáním

Krok 3: Co potřebujete - software

Aby byly všechny části pohromadě, musí být nainstalováno a spuštěno následující nastavení softwaru:

Na Raspberry Pi budete muset nainstalovat následující:

  • Arduino IDE - slouží k sestavení skici a jejímu zaslání do UNO
  • Modul Python pro Arduino - pro sériovou komunikaci mezi UNO a Pi
  • Klientská knihovna Python SignalR - Zde si můžete přečíst pokyny

Počítač se systémem Windows s nainstalovaným následujícím vývojovým prostředím:

  • Bezplatná edice aplikace Microsoft Visual Studio Express 2013 k vytváření aplikace SignalR Hub a webové klientské aplikace
  • Bezplatná edice serveru SQL Server 2012 Express k návrhu a sestavení databáze typu back-end

Hostitelské prostředí Windows Internet Information Server (IIS):

  • Jakmile bude SignalR Hub a webový klient sestaven a testován, bude nutné jej nasadit na místní server IIS
  • V mém případě plánuji ve své domácí síti použít starý notebook se systémem Windows 7 s IIS

POZNÁMKA

Všechny pokyny platí pro verzi Python 2.7.x. Verze 3.0 může vyžadovat přepsání

Krok 4: Databáze serveru SQL

Databáze serveru SQL
Databáze serveru SQL

Připojené schéma ukazuje strukturu základní databáze SQL Serveru používané v této aplikaci a obsahuje pouze dvě tabulky.

Tabulka AutoHubCode

Dva důležité sloupce v této tabulce jsou:

AutoCodeKey - ukládá uživatelsky přívětivý název kódu

Každý z kódových klíčů je přenášen automatizačním klientem - v našem případě tlačítkem HTML z webové stránky

AutoCodeVal - ukládá nezpracovanou sekvenci IR kódu

Toto je skutečný IR kód, který je přenášen zpět do klienta v reakci pomocí centra SignalR

V tomto případě klient Pythonu v neustálé komunikaci s Hubem přijímá sekvenci IR kódu a přenáší ji přes sériový port do Arduino UNO

Tabulka AutoHubLog

  • Zaznamenává kód požadovaný klientem automatizace.
  • Toto je opatření ke sledování toho, kdo a kdy systém používal a jaký kód byl požadován

Jak již bylo zmíněno, jako zvolenou databázovou platformu jsem použil SQL Server 2012. Tento jednoduchý design můžete znovu vytvořit na jiné databázové platformě, jako je MySQL, Oracle atd.

Přesto zde byl připojen skript SQL k vytvoření této databáze

POZNÁMKA

  1. Kód pro centrum SignalR je určen k připojení k databázi SQL Server 2012
  2. Práce s jinou databází by znamenalo změnit Hub tak, aby používal jiný ovladač databáze

Krok 5: Webová aplikace ASP. NET SignalR Hub

Webová aplikace ASP. NET SignalR Hub
Webová aplikace ASP. NET SignalR Hub
Webová aplikace ASP. NET SignalR Hub
Webová aplikace ASP. NET SignalR Hub

Webová aplikace ASP. NET SignalR Hub společně obsahuje následující komponenty, jak je uvedeno v přiloženém schématu:

Oddíl 1 - Centrum SignalR, které přijímá požadavky od klienta a odpovídá na něj

Oddíly 2, 4 - Webová stránka klienta HTML a její šablona stylů, které společně tvoří frontend systému Automation a vydávají příkazy do centra Automation Hub

Část 3 - Rozhraní API jQuery SignalR používaná klientem HTML ke komunikaci s Centrem automatizace

Část 5 - Centrum SignalR Hub nekomunikuje přímo s databází. Dělá to prostřednictvím přechodných tříd generovaných pomocí Entity Framework

Tyto třídy abstraktují detaily databáze z front -endové aplikace

Oddíl 6 - Třída databázové služby, která pomáhá provádět operace čtení a zápis v databázi SQL (popsáno dříve) pomocí tříd Entity Framework

ASP. NET a SignalR jsou technologie společnosti Microsoft a tento tutoriál vás provede tím, jak je jednoduchá aplikace SignalR vytvořena a nasazena.

To, co jsem zde postavil, je založeno na základech získaných z tohoto tutoriálu. Při nasazení by aplikace měla vypadat podobně jako webová stránka zobrazená na druhém obrázku

POZNÁMKA KÓDU

Byl připojen soubor ZIP obsahující svlečenou verzi kódu

Struktura složek je zobrazena na vizuálu - všechny třídy framework a skripty jQuery však byly odstraněny, aby se zmenšila velikost přílohy.

Doporučuje se, aby byl tento kód použit jako vodítko, protože když vytvoříte novou webovou aplikaci SignalR pomocí výše uvedeného odkazu na výukový program, nejnovější knihovny jQuery a třídy rozhraní ASP. NET budou přidány automaticky

Také odkazy na skripty jQuery na stránce index.html bude nutné změnit, aby odrážely nejnovější verzi klientských knihoven jQuery SignalR, které budou automaticky přidány při vytváření webové aplikace.

Nakonec bude nutné změnit připojovací řetězec, aby odpovídal vaší databázi v souborech pojmenovaných jako Web.config*

Krok 6: Klient služby Python SignalR

Klient služby Python SignalR
Klient služby Python SignalR

Zatímco klient HTML SignalR je uživatelským rozhraním orientovaným zepředu, klient Python je aplikací back -endové služby, jejíž hlavní funkcí je přijímat IR kód přenášený Hubem a směrovat jej do Arduino UNO přes sériovou komunikaci.

Připojený kód je samovysvětlující a je dostatečně zdokumentován, aby popisoval jeho funkčnost

Jak je ukázáno na kompozitním snímku obrazovky, klient HTML a klient služby Python komunikují prostřednictvím centra SignalR následujícím způsobem:

  1. Uživatel automatizačního systému vydá příkaz do Hubu kliknutím na tlačítko
  2. Každé tlačítko je spojeno s kódem IR klíče a po kliknutí se tento kód přenese do Hubu
  3. Rozbočovač obdrží tento kód, připojí se k databázi a načte nezpracovaný kód IR signálu a odešle jej zpět všem připojeným klientům

    Rozbočovač současně zaznamenává záznam do databázové tabulky AutoHubLog a zaznamenává kód a datum a čas, kdy jej požadovali vzdálení klienti

  4. Klient služby Python obdrží IR kód a předá jej Arduino UNO k dalšímu zpracování

Krok 7: Skica a kód přenosu IR Arduino UNO

Skica a kód přenosu IR Arduino UNO
Skica a kód přenosu IR Arduino UNO
Skica a kód přenosu IR Arduino UNO
Skica a kód přenosu IR Arduino UNO
Skica a kód přenosu IR Arduino UNO
Skica a kód přenosu IR Arduino UNO

Obvod Arduino, jak je znázorněno na obrázcích, je pro tento systém velmi jednoduchý, a proto je stručně popsán:

  • Bezbarvá IR LED musí být připojena k Digital PIN 3 na UNO - to je požadavek knihovny IRLib Arduino
  • Důvody jsou popsány v mém dřívějším IBLE při klonování dálkového ovladače v sekci související s knihovnou IRLib
  • Zelená LED připojená k digitálnímu PIN 4 je vizuální indikátor, který se rozsvítí, když UNO přijme všechny části IR kódu od klienta Python běžícího na Raspberry Pi.
  • Rozsvícení této LED diody potvrdí, že sériová komunikace mezi Raspberry Pi a UNO funguje
  • Pro povolení sériové komunikace je UNO připojen k Raspberry Pi přes USB port
  • Připojená skica Arduino je dostatečně komentována, aby popsala její funkci
  • Komentáře v horní části kódu také popisují, jak je třeba obvod zapojit

POZNÁMKA

V praxi bylo možné Arduino a Pi společně připojit k napájenému rozbočovači USB, který je dostatečně silný na to, aby poháněl Pi, Arduino a také vysílal silný signál prostřednictvím IR LED

Krok 8: Zapojení a testování systému

Zapojení a testování systému
Zapojení a testování systému
Zapojení a testování systému
Zapojení a testování systému
Zapojení a testování systému
Zapojení a testování systému
  1. Sestavte a nasaďte ASP. NET SignalR Hub, klienta HTML spolu s databází SQL Server 2012 na Internet Information Server (IIS) ve vaší místní domácí síti
  2. Otevřete webovou aplikaci otevřením klienta HTML SignalR přes

    adresa URL této stránky by obvykle byla https:// váš počítač: číslo_portu/

  3. Klikněte na tlačítko na ovládacím panelu a pokud byla aplikace správně nasazena, rozbočovač odpoví vrácením IR kódu a jeho zobrazením na šedém panelu sousedícím s ovládacím panelem

    Pamatovat si! Kódy budete muset načíst do své databáze nastavením knihovny IR přijímače a zachycením kódů, jak je popsáno v mém předchozím IBLE

  4. Připojte Arduino k Raspberry Pi přes USB - otevřete Arduino IDE na Pi a ujistěte se, že UNO může navázat spojení s Pi

    tyto výukové články k Arduinu by vám měly pomoci se v tom rychle zorientovat

  5. Otevřete kód Pythonu a proveďte následující změny podle vašeho prostředí

    • adresu sériového portu vašeho UNO získanou z kroku 4
    • adresa URL centra SignalR, aby odpovídala vaší místní adrese URL z kroku 2 - v tomto případě by to bylo https:// yourComputer: port_number/signalr
  6. Nakonec otevřete náčrt Arduina v Arduino IDE na Raspberry Pi a zasuňte jej do UNO
  7. Umístěte desku na chléb, která drží obvod, v těsné blízkosti spotřebiče, který chcete ovládat - IR LED musí mít jasný výhled na port IR přijímače spotřebiče
  8. Spusťte program Python na Raspberry Pi stisknutím tlačítka F5 na liště nástrojů Python IDLE
  9. Vraťte se na ovládací panel v klientském programu HTML (krok 2) a klikněte na tlačítko (například Zapnout nebo Zvýšit hlasitost)

Pokud je systém nastaven správně, měli byste být schopni v telefonu nebo tabletu vyvolat stránku klienta HTML a ovládat zařízení pomocí tlačítek na stránce klienta HTML.

Krok 9: Systém v akci

Systém v akci
Systém v akci
Systém v akci
Systém v akci
Systém v akci
Systém v akci
Systém v akci
Systém v akci

Vizuály výše ukazují systém domácí automatizace v provozu, jakmile je nastaven.

Od vydání tohoto IBLE jsem rozšířil rozhraní zachycením několika IR kódů z mé LED TV VIZIO

Jak je ukázáno vedle sebe s továrním dálkovým ovladačem TV v prvním vizuálu, do webového uživatelského rozhraní přístupného přes můj tablet bylo zabudováno několik základních funkcí tohoto dálkového ovladače

Následné vizuály ukazují tablet v popředí s televizorem vzadu, který reaguje na příkazy vydané z webového rozhraní:

  1. Příkaz Vypnout - TV se vypne
  2. Příkaz Zapnout - TV se zapne a při zapnutí obrazovky se objeví logo „V“
  3. Příkaz Mute ON - Při ztlumení reproduktoru se objeví vodorovná lišta

Ve všech testech zobrazuje šedá oblast vedle řídicího panelu na obrazovce tabletu příkaz vydaný klientem a odpověď odeslanou vzdáleným centrem SignalR

Krok 10: Vylepšení systému automatizace a související opravy

Tento systém lze rozšířit přidáním dalších kódů zachycených z různých systémů. I když je tato část snadná, existují dva další faktory, které budete muset vzít v úvahu.

Vylepšení 1 (rychlé): Práce s infračervenými signály různých délek

  1. IR kódy různých systémů se dodávají s různými délkami, dokonce i mezi dvěma produkty od stejného výrobce.

    Například v tomto případě je délka pole IR kódu pro LED TV 67, zatímco délka zvukového panelu Samsung je přibližně 87

  2. To znamená, že kdybych nejprve zapnul Sound Bar, pole IR Buffer ve skice Arduino by bylo naplněno sekvencí IR kódu, která obsahuje 87 kódů
  3. V návaznosti na to, kdybych zapnul LED televizi, zaplnilo by pole IR Buffer pouze 67 kódy, ale zbývajících 20 kódů z předchozí operace by bylo stále kolem

Výsledek? LED TV se nezapne, protože vyrovnávací paměť IR kódů byla poškozena o dalších 20 kódů, které nebyly vyčištěny z předchozí operace!

Oprava 1 (snadná cesta ven, nedoporučujeme)

Skicu Arduino změňte následujícím způsobem:

Změňte následující volání funkcí ve funkci loop () {}

transmitIRCode ();

vysílat IRCode (c);

Proveďte změny v podpisu výše uvedené funkce:

void transmitIRCode (int codeLen) {// Konstanta RAWBUF nahrazena codeLen IRTransmitter. IRSendRaw:: send (IRCodeBuffer, codeLen, 38); }

I když je to snadné, pole se nikdy úplně nevyčistí, a proto to není příliš čisté řešení

Oprava 2 (Není těžké, doporučeno)

Po sekci komentářů deklarujte další proměnnou na samém vrcholu skici Arduino:

nepodepsané int EMPTY_INT_VALUE;

Přidejte toto do horní části funkce setup ():

// Zachycení přirozeného stavu prázdné celočíselné proměnné bez znaménkaEMPTY_INT_VALUE = IRCodeBuffer [0];

Přejděte dolů a přidejte do skici novou funkci bezprostředně po funkci transmitIRCode ():

void clearIRCodeBuffer (int codeLen) {// Vymazání všech kódů z pole // POZNÁMKA: nastavení prvků pole na 0 není řešením! pro (int i = 1; i <= codeLen; i ++) {IRCodeBuffer [i-1] = EMPTY_INT_VALUE;}}

Nakonec volejte novou funkci výše na následujícím místě ve funkci loop ():

// Reset - Pokračovat ve čtení Serial PortclearIRCodeBuffer (c);…

Toto je čistší přístup, protože ve skutečnosti resetuje všechna umístění v poli IR Buffer, která byla naplněna nejnovějším signálem IR kódu, aniž by byla ponechána náhoda.

Vylepšení 2 (Více zapojeno): Opakovaný přenos signálu IR pro určitá zařízení

Některá zařízení vyžadují, aby byl stejný signál vyslán vícekrát, aby mohl reagovat Příklad: V takovém případě zvukový panel Samsung vyžaduje, aby byl stejný kód odeslán dvakrát s odstupem 1 sekundy

Oprava v konceptu zde byla diskutována, protože je trochu více zapojena a bude vyžadovat testování

Přidání funkce opakování do skici Ardunio bude znamenat, že budete muset skicu blikat pokaždé, když do systému domácí automatizace přidáte nové zařízení

Místo toho přidáním této opravy do klienta HTML SignalR a aplikace Python SignalR Service bude řešení mnohem flexibilnější. A toho lze v zásadě dosáhnout takto:

Upravte klienta HTML SignalR tak, aby do Hubu přenášel informace o opakování

Otevřete index.html a vložte hodnotu opakování do tlačítka HTML takto:

value = "SMSNG-SB-PWR-ON" by se stalo value = "SMSNG-SB-PWR-ON_2_1000"

Kde 2 je hodnota opakování a 1000 je hodnota zpoždění v milisekundách mezi dvěma signály opakování

Když kliknete na toto tlačítko, centrum SignalR obdrží kód klíče+Repeat_Spec

Upravte postranní metody serveru SignalR tak, aby analyzovaly pouze kód klíče:

  • Pomocí kódu klíče načtěte IR kód z databáze jako obvykle
  • Odešlete klíčový kód+Repeat_Spec a IRCode klientům SingalR jako obvykle

Upravte aplikaci služby Python SignalR tak, aby přenášela signály pomocí hodnot Opakovat:

Otevřete klienta Python a upravte následující dvě funkce:

def print_command_from_hub (buttonId, cmdSrc):

# analyzujte opakovaný kód z hodnoty buttonId

def transmitToArduino (IRSignalCode, delim, endPrefix):

# nastavte chvíli nebo smyčku pro přenos signálu na požadované frekvenci

  • Tímto způsobem se Arduino nemusí opakovaně blikat
  • Do tohoto systému lze zabudovat libovolný počet opakovacích frekvencí
  • Kromě toho, pokud používáte UNO, existuje omezení velikosti, do které může váš Sketch narůst!

Krok 11: Známé problémy a obavy o zabezpečení

Jak je tomu u systémů postavených úplně poprvé, i tento má několik problémů, které se objevily během testování.

Problém 1: Spouštěcí příkazy v rychlém sledu se zpožděním mezi kliknutími na tlačítko méně než jednu sekundu způsobily, že systém po několika prvních reakcích přestal reagovat.

  • Restartováním klienta Python SignalR se systém vrátí zpět do normálního provozu
  • Okamžitým řešením může být odstranění nežádoucích výstupů ladění v klientu Python SignalR a také v Arduino Sketch a opakování těchto testů
  • Dalším místem, kde bychom se měli podívat, by byla samotná sériová komunikace - bylo by možné přidat kód pro rychlé vyprázdnění vyrovnávací paměti?

To znamená, že jsem si všiml, že moje televize nereaguje dobře na její tovární dálkové ovládání - proto může také přispět samotná povaha IR komunikace mé televize.

Problém 2: Obrazovka HTML přestane reagovat na kliknutí na tlačítka po delší době nečinnosti

Toto chování obvykle vyřeší obnovení stránky - příčina tohoto chování je však stále nejasná

BEZPEČNOSTNÍ OTÁZKY

Tento systém byl navržen pouze pro použití v místní (domácí) síti a nemá potřebná bezpečnostní opatření, která by bylo možné používat přes internet

Proto se doporučuje, aby bylo centrum SignalR nasazeno na místní počítač ve vaší místní/domácí síti

Děkuji za přečtení mého IBLE a doufám, že se pobavíte!

Doporučuje: