Industrielle Fertigung
Industrielles Internet der Dinge | Industrielle Materialien | Gerätewartung und Reparatur | Industrielle Programmierung |
home  MfgRobots >> Industrielle Fertigung >  >> Manufacturing Technology >> Herstellungsprozess

Arduino Home Controller aktiviert von Alexa

Komponenten und Verbrauchsmaterialien

Arduino Yun
× 1
ControlEverything.com 4-KANAL-RELAIS-CONTROLLER FÜR I2C
× 1
DHT11 Temperatur- und Feuchtigkeitssensor (4 Pins)
× 1
Widerstand 10k Ohm
× 2
SparkFun RedBot Summer
× 1
Allzwecktransistor NPN
× 1
LM2596 DC-DC-Abwärtswandler
× 1
Amazon Alexa Echo Dot
× 1
Arduino Proto Shield
× 1
USB-WebCam
× 1
Weiße Anschlussdose 200 mm x 155 mm x 80 mm
× 1

Notwendige Werkzeuge und Maschinen

Lötkolben (generisch)

Apps und Onlinedienste

Arduino-IDE
Amazon Alexa Alexa Skills Kit
Amazon Web Services AWS Lambda
PubNub Publish/Subscribe-API

Über dieses Projekt

Übersicht

Wenn Amazon Alexa und Geräte wie Amazon Echo Dot auf den Markt bringt, eröffnen sich unendlich viele Optionen, um ein großartiges Smart Home zu gestalten, das durch Sprachbefehle in natürlicher Sprache gesteuert wird.

Dieses Projekt stellt einen Arduino Home Controller her, der viele Sensoren und Geräte mit dem Internet verbinden kann und Sie mit einem Amazon Alexa Skill steuern können.

Sie können meinen Skill "Arduino Home Controller installieren und aktivieren " der einfache Schritt, oder Sie können Ihre Fähigkeiten von diesem Tutorial leiten lassen.

Vorerst werden wir kontrollieren:

  • Vier Lichter in Zimmer, Garage, Küche und Wohnzimmer.
  • Temperatur- und Feuchtigkeitssensor.
  • Summeralarm.
  • WebCam zum Aufnehmen eines Sicherheitsfotos und zum Senden per E-Mail.

In dieser kurzen Videodemo können Sie den Arduino Home Controller in Aktion sehen. Für Demo und Video schlage ich vor, dass ich vier LEDs im Prothoboard verwende, die Glühbirnen in jedem Hauszimmer simulieren.

Wenn Sie Remote-Module verwenden möchten, um Ihre Lichter zu aktivieren, können Sie meine Arduino Home Controller Remote-Module anzeigen Projekt unter dieser URL.

Blockdiagramm

Im Blockdiagrammbild Wir können die vier Hauptkomponenten dieses Projekts sehen:

1.- Amazon Echo Dot um Sprachbefehle zu empfangen und an AWS (Amazon Web Service) zu senden.

2.- AWS mit einem Amazon Skill und einer Lambda-Funktion um alle Befehle zu interpretieren.

Der Skillname ist "Arduino Home Controller " Sie können es später aktivieren.

3.- Ein MQTT-Broker unter Verwendung der PubNub(c)-Cloud.

Dieser Broker empfängt die Steuernachrichten in zwei Kanälen, einen für Sollwerte und einen zum Lesen von Werten von Sensoren.

Sie müssen kein Konto in PubNub erstellen, Sie können mein Konto für Demo-Vorschläge verwenden.

4.- Home-Controller mit Arduino Yun.

Wir werden Arduino Yun verwenden, weil es einen Ethernet-Schild enthält und eine kleine Linux-Maschine hat, auf der wir Python ausführen, um einige Aktionen auszuführen.

Es steuert Relais für Lichter, liest Temperatur- und Feuchtigkeitssensor, schaltet den Summer für Alarm ein und manipuliert eine Webcam, um ein Sicherheitsfoto zu machen.

Für Remote-Module siehe meine ergänzenden Arduino Home Controller Remote Module Projekt unter dieser URL.

Installieren Sie alle erforderliche Software

An dieser Stelle können Sie zwei Optionen zum Demo-Vorschlag wählen, meinen Alexa-Skill verwenden, ihn installieren und verwenden oder Option zwei, um Ihren persönlichen Skill zu erstellen.

Durchsuchen Sie die Alexa-App mit dieser URL , Wählen Sie dort den Abschnitt Fähigkeiten im Menü aus, suchen Sie Arduino und in der Liste sehen Sie den Skill mit dem Namen "Arduino Home Controller ", klicken Sie in die Skillkarte und klicken Sie auf die Schaltfläche "Aktivieren", um die Installation zu starten.

Oder Sie müssen über diesen Link zum Amazon Skill Store gehen und drücken Sie die Taste "Aktivieren"

Sie müssen Ihr Amazon-Konto verknüpfen, da wir Ihre E-Mail-Adresse als ID für alle Befehle verwenden, die an Arduino gesendet werden. Beachten Sie, dass wir diese Adresse nicht zum Senden von E-Mails verwenden, sondern nur als ID verwenden.

Skill ist installiert und mit dem Amazon-Konto verknüpft und mit meiner Lambda-Funktion in der AWS-Cloud verbunden.

1.- Erstellen ein Fähigkeit

Sie müssen sich registrieren und ein kostenloses Entwicklerkonto auf der Website https://developer.amazon.com/home.html erstellen

1.1.- Sobald die Anmeldung zu Alexa geht Menüoption und wählen Sie im Alexa Skills Kit die Schaltfläche "Erste Schritte"

1.2.- Klicken Sie anschließend auf die Schaltfläche "Neuen Skill hinzufügen", um einen neuen Skill zu erstellen.

1.3.- Bei Neuen Alexa-Skill erstellen Abschnitt müssen Sie:

  • Wählen Sie:Benutzerdefiniertes Interaktionsmodell
  • Sprache Englisch US
  • Name TestSkill ist der Skill-Name, der für die Suche im Store verwendet wird.
  • Aufrufname Testfähigkeit ist der Name, um Sprachbefehle wie Alexa Ask, Test Skill zum Einschalten des Alarms . zu starten
  • Alle globalen Felder setzen alle auf Keine Option
  • Klicke auf "Speichern"

Der neue Skill wurde erstellt und Sie sehen ein neues Feld Anwendungs-ID

amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb 

Es wird für die Verbindung zwischen Skill und Lambda-Funktion verwendet, wir verwenden es später im Tutorial-Abschnitt 2.5.

1.4.- Das Interaktionsmodell definiert hier, wie Sie mit der Fertigkeit interagieren, basierend auf der Definition von Absichten, Slots und Äußerungen.

Beim Interaktionsmodell Menüoption Kopieren Sie dieses Json-Schema und fügen Sie es in Intent-Schema ein.

{ "intents":[ { "slots":[ { "name":"light", "type":"States" }, { "name":"which", "type":" HabRooms" } ], "intent":"LightIntent" }, { "slots":[ { "name":"alarm", "type":"States" } ], "intent":"AlarmIntent" }, { " Intent":"TakePhotoIntent" }, { "Intent":"GetTemperatureIntent" }, { "Intent":"GetHumidityIntent" }, { "Intent":"AboutIntent" }, { "Intent":"AMAZON.HelpIntent" }, { "Intent":"AMAZON.CancelIntent" }, { "Intent":"AMAZON.StopIntent" } ]} 

Definieren Sie einige notwendige Slots wie Zustände und HabRooms in benutzerdefinierten Slot-Typen.

Definieren Sie alle Äußerungen wie ein Konversationsmodell in Beispieläußerungen , kopiere diese Liste und füge sie ein.

LightIntent Turn {which} light {light}LightIntent Set {which} light {light}AlarmIntent Turn alarm {alarm}TakePhotoIntent Foto machenTakePhotoIntent Sicherheitsfoto machenGetTemperatureIntent Read TemperatureGetHumidityIntent Read HumidityAboutIntent Tell me aboutAboutIntent About 

Bevor Sie mit dem nächsten Abschnitt fortfahren, Konfiguration wir müssen unsere Lambda-Funktion erstellt haben, da wir sowohl den Skill als auch die Lambda-Funktion verknüpfen müssen.

2.- Erstellt eine Lambda-Funktion

Sie müssen sich bei der AWS Console registrieren und ein Konto erstellen, verwenden Sie die URL https://aws.amazon.com/console/

2.1.- Wählen Sie Dienste in oben Menü und Lambda im Menü der linken Leiste.

2.2.- Wählen Sie in der linken Leiste Funktion und klicken Sie auf die Schaltfläche "Funktion erstellen".

2.3.- Stellen Sie diese Daten ein:

  • Klick Autor von Grund auf
  • Name: TestSkillLambda
  • Laufzeit: Node.js.6.10
  • Rolle: Benutzerdefinierte Rolle erstellen

Dies öffnet ein neues Fenster, in dem Sie die folgenden Werte auswählen sollten:

  • IAM-Rolle: Lambda_Basic_Execution
  • Name der Richtlinie: „Neue Rollenrichtlinie erstellen“, dann bearbeiten Sie die Richtlinie und fügen Sie Folgendes ein:
{ "Version":"2012-10-17", "Statement":[ { "Effect":"Allow", "Action":[ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource":"arn:aws:logs:*:*:*" }, { "Effect":"Allow", "Action":[ "iot:UpdateThingShadow" ], "Resource" :"*" } ]} 

Drücken Sie zum Speichern die Schaltfläche "Hinzufügen" und kehren Sie zu Funktion erstellen zurück Seite und wählen Sie lambda_basic_execution in Bestehender Rolle Feld.

2.4.- Das TestSkillLambda Funktion wurde erstellt und Sie sehen ihre Designerseite.

2.5.- Wählen Sie aus der linken Menüleiste Alexa Skills Kit und fügen Sie es zu Trigger hinzufügen hinzu abgegrenzter Bereich.

Klicken Sie auf Alexa-Skills-Kit und scrollen Sie nach unten zu Trigger konfigurieren Option, wählen Sie Aktivieren und in Skill-ID Feld kopieren und Anwendungs-ID einfügen Wert später speichern, siehe Tutorial Abschnitt Nummer 1.3.

Derzeit verknüpfen wir die Lambda-Funktion mit dem Skill mithilfe der Anwendungs- oder Skill-ID.

Drücken Sie die Schaltfläche "Speichern" und Alexa Skills Kit werden gespeichert und funktionieren Lambda Knows Skill und sind verlinkt.

2.6.- Scrollen Sie nach unten zu Funktionscode Abschnitt und Set-Felder:

  • Code-Eingabetyp:Eine .zip-Datei hochladen
  • Laufzeit: Node.js 6.10
  • Drücken Sie die Schaltfläche "Hochladen " zum Hochladen von Funktionscode mithilfe der Datei data.zip .

Der Code-Editor wird geöffnet und Sie sehen die hochgeladenen Ordner und Dateien.

Wählen Sie die Datei index.js es enthält alle Funktions-Lambda-Implementierungen.

Sie müssen die Zeile 23 ändern, die gleiche Anwendungs-ID kopieren und einfügen später im Tutorial-Abschnitt 1.3 verwendet.

Drücken Sie die Taste "Speichern" und die Lambda-Funktion wurde aktiviert, um Fertigkeitsbefehle zu erhalten.

var APP_ID =amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb 

Oben auf der Seite oben auf der Schaltfläche "Speichern" sehen Sie den ARN (Amazon Resource Name). Dies ist die ID der Lambda-Funktion, die wir bei der Konfiguration verwenden werden Abschnitt auf der Skill-Seite.

3.- Zurück zur Skill-Definition

3.1.- Wählen Sie Konfiguration Abschnitt, bei EndPoint wählen Sie AWS Lambda ARN, kopiere den obigen ARN-String und füge ihn in Standard ein Bereich. Dies ist die letzte Aktion, um Skill und Lambda-Funktion, Skill-Knowledge-Funktion Lambda und miteinander zu verknüpfen.

3.2.- Scrollen Sie nach unten zu Kontoverknüpfung Abschnitt und kopieren Sie die beiden ersten Umleitungs-URLs Sie benötigen sie, um das Sicherheitsprofil zu konfigurieren.

Bevor wir mit der Skill-Konfiguration fortfahren, müssen wir ein Sicherheitsprofil definieren, das verwendet wird, um den Skill und das Amazon-Konto in der Alexa App zu verknüpfen.

4.- Sicherheitsprofil erstellen

Wählen Sie in derselben Entwicklerkonsole, die zum Erstellen eines Skills verwendet wurde, Apps &Dienste . aus und Mit Amazon einloggen und drücke die Taste "Erstellen a Neu Sicherheit Profil"

4.1.- Sicherheitsprofilverwaltung Seite können Sie ein Profil mit voller OAuth 2.0-Sicherheit erstellen, um den Skill mit Ihrem Amazon-Konto zu verknüpfen.

4.2.- Füllen Sie alle Felder mit diesen Daten:

  • Sicherheitsprofilname :TestSkillProfile
  • Sicherheitsprofilbeschreibung :Von TestSkill verwendetes Profil
  • URL zur Einwilligungs-Datenschutzerklärung :https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 Dies ist ein Beispiel, das Sie verwenden müssen.
  • Klicken Sie auf die Schaltfläche "Speichern".

4.3.- Beim Speichern aller Daten oder Bearbeiten des Sicherheitsprofils zeigen zwei neue Felder wichtige Daten an, Kunden-ID und Client-Geheimnis . Du benötigst sie für die Fertigkeitskonfiguration.

4.4.- Definieren Sie die Whitelist-URLs, wählen Sie die Registerkarte Webeinstellungen

  • Zulässige Herkunft :https://layla.amazon.com und https://pitangui.amazon.com
  • Zulässige Rückgabe-URLs :füge die beiden ersten URLs aus Abschnitt 3.2 hinzu

5.- Fertigkeitserstellung abschließen

5.1.- Zurück zur Skill-Definition, wählen Sie Konfiguration Abschnitt und scrollen Sie nach unten zu Kontoverknüpfung .

  • Erlauben Sie Nutzern, ein Konto zu erstellen :Wählen Sie Ja
  • Autorisierungs-URL :https://www.amazon.com/ap/oa/?redirect_url=UUUUUU Wo "UUUUUU" steht, müssen Sie dies durch eine der Weiterleitungs-URLs . ersetzen von weiter unten auf der Seite. Der Link sieht dann in etwa so aus https://www.amazon.com/ap/oa/?redirect_url=https://layla.amazon.com/api/skill/link/UUUUUU
  • Kundennummer :Client-ID kopieren und einfügen aus Abschnitt 4.3.
  • Umfang :Profil , siehe Erklärung unter dieser URL.

5.2.- Fahren Sie mit der Kontoverknüpfung fort:

  • Art der Autorisierung :Auth-Code gewähren
  • Zugriffstoken-URI :https://api.amazon.com/auth/o2/token
  • Client-Geheimnis :Client-Geheimnis kopieren und einfügen aus Abschnitt 4.3.
  • URL der Datenschutzerklärung :https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 Dies ist ein Beispiel, das Sie verwenden müssen.
  • Klicken Sie auf die Schaltflächen "Speichern" und "Weiter".

5.3.- Globale Felder ist der Abschnitt, der verwendet wird, um die Fertigkeit zu dokumentieren.

  • Wählen Sie eine Kategorie aus, in der die Fähigkeit nach der Zertifizierung im Geschäft zu finden ist , "Smart Home"
  • Testanleitung
  • Skill wird in allen Ländern verfügbar sein .
  • Kurze Beschreibung
  • Vollständige Beschreibung der Fähigkeiten
  • Beispielsätze
  • Einige Schlüsselwörter, die die Fähigkeit definieren
  • Png- oder Jpg-Symbol 108x108 Pixel
  • Png- oder Jpg-Symbol 512 x 512 Pixel

5.4.- Letzter Abschnitt Datenschutz &Compliance

6.- TestSkill in der Alexa App installieren

6.1- Wenn Sie den Skill speichern, können Sie die Alexa App unter https://alexa.amazon.com/ aufrufen. Wählen Sie im Menü der linken Leiste die Option Skills , klicke oben rechts auf "Deine Fähigkeiten" und den Filter Entwicklerfähigkeiten Sie können TestSkill sehen Karte. Beachten Sie die Meldung zur erforderlichen Kontoverknüpfung.

6.2.- Wenn Sie auf die Karte klicken, wird der TestSkill Beschreibungsseite zeigt alle Informationen über den Skill an, klicken Sie auf die Schaltfläche "Aktivieren".

6.3.- Aufgrund der erforderlichen Definition für die Kontoverknüpfung müssen Sie auf die Seite mit den Anmeldeinformationen von Amazon umleiten, um den Skill mit Ihrem Amazon-Konto zu verknüpfen.

Wenn die Anmeldeinformationen validiert sind, sehen Sie diese Seite, die darauf hinweist, dass der Skill mit Ihrem Amazon-Konto verknüpft ist.

6.4.- Der Skill ist fertig, installiert und mit Ihrem Amazon-Konto verknüpft und mit der Lambda-Funktion verbunden.

Sie können testen, sagen Sie Alexa, fragen Sie Testfähigkeit und Sie sehen das Willkommen beim Arduino Home Controller, da alle Dialoge gleich sind.

Arduino Yun konfigurieren

Wenn Sie Arduino Yun zum ersten Mal verwenden, müssen Sie es vor dem Hochladen der Skizze vorbereiten.

Ich empfehle, den Leitfaden oder das Tutorial von Greg Baugues zu lesen. Erste Schritte mit dem Arduino Yun – dem Arduino mit WiFi. Vielen Dank an Hackster-Benutzer @BenEagen für das Auffinden dieser Anleitung.

Um Fotos zu machen und damit E-Mails zu senden, müssen wir zusätzliche Software installieren. Wir werden auch die USB-Kamera testen, um zu sehen, ob die Treiber richtig funktionieren. Bitte schließen Sie die USB-Webcam an den USB-Port von Arduino Yun an.

Verbinden Sie sich dazu mit einem Terminal mit Arduino Yun:

ssh [email protected] 

Das Standardpasswort ist arduino.

Wenn die Verbindung in Ordnung ist, sehen Sie die OpenWRT Linux-Eingabeaufforderung:

Installieren Bilderzeugung Software

Beginnen Sie mit einem Update des Paketmanagers:

opkg-Update 

Installieren Sie die UVC-Treiber:

opkg install kmod-video-uvc 

Python-openssl-Paket installieren:

opkg installiere python-openssl 

Wir benötigen auch das Dienstprogramm fswebcam, mit dem wir Bilder vom Terminal aufnehmen:

opkg installiere fswebcam 

Stellen Sie sicher, dass die SD-Karte in Arduino Yun gemountet ist. Sie können es testen, indem Sie diesen Befehl ausführen:

mount 

Wenn Sie in der Geräteliste eines wie /dev/sda1 auf /mnt/sda1 sehen, geben Sie vfat ein SD-Karte ist in Ordnung.

Die Kamera zu testen und ein Foto zu machen, ist ganz einfach. Geben Sie einfach ein:

cd /mnt/sda1fswebcam test.png 

Sie sollten einige Informationen zusammen mit einigen Fehlern sehen, aber machen Sie sich keine Sorgen. Wichtig ist, diese Zeilen zu sehen:

--- Öffnen von /dev/video0...Versuchen des Quellmoduls v4l2.../dev/video0 geöffnet. 

Um zu überprüfen, ob das Bild richtig aufgenommen wurde, entfernen Sie die SD-Karte aus dem Arduino Yun und lesen Sie sie mit Ihrem Computer aus. Sie sollten das Bild im Stammverzeichnis der SD-Karte "test.png . sehen ".

Öffnen Sie es einfach, um sicherzustellen, dass es richtig aufgenommen wurde und nicht beschädigt ist.

Installieren E-Mail-Software senden

Kopieren Sie mit der SD auf Ihrem Computer die Python-Datei AHC_SendEmail.py und ändern Sie Ihre E-Mail-Adresse und Ihr Passwort von einem Gmail-Konto, Zeilen 11, 12 und 13, wenn Sie einen anderen E-Mail-Anbieter haben, ändern Sie die Serverinformationen in Zeile 36.

Extrahieren Sie die SD vom Computer und stecken Sie sie in den SD-Steckplatz in Arduino Yun ein. Führen Sie am Terminal, das mit Arduino Yun verbunden ist, die Befehle aus:

cd /mnt/sda1python /mnt/sda1/AHC_SendEmail.py /mnt/sda1/ test.png 

Wenn alles in Ordnung ist, müssen Sie eine E-Mail mit Ihrem Foto erhalten.

Alle Geräte mit Arduino Yun verbinden

Basierend auf dem elektronischen Schaltplan schließen Sie alle Geräte an, insbesondere den DHT11-Sensor, da wir ihn zum Lesen von Temperatur und Luftfeuchtigkeit und einen Summer zum Testen des Alarmtons benötigen.

Installieren die Skizze Datei ArduinoHomeMQTT.ino

Ich erstelle eine libraries.zip Datei mit allen Bibliotheken, die von dieser Datei benötigt werden, können Sie sie von meiner GitHub-Site herunterladen und im Arduino IDE-Bibliotheksverzeichnis entpacken.

Bibliotheken in der libraries.zip innerhalb von ArduinoHomeMQTT Ordner.

ArduinoJson --> Wird verwendet, um Json-Inhalte zu manipulierenDHT_sensor_library --> Wird verwendet, um DHT sensorpubsubclient-master zu verarbeiten --> Wird verwendet, um PubNub(c) zu verbinden, zu veröffentlichen und zu abonnieren 

Öffnen Sie Arduino IDE 1.6.x, wählen Sie in den Tools "Board:Arduino Yun".

Laden Sie die Datei ArduinoHomeMQTT.ino und ändern Sie in der IDE Zeile 16 mit Ihrer Amazon-E-Mail-Adresse, die verwendet wird, wenn das verknüpfte Konto im Amazon App-Skill aktiviert ist.

Diese Option identifiziert Ihren Controller, wenn AWS eine MQTT-Nachricht an den Broker sendet.

Ändern Sie Zeile 50 mit Ihrer uuid, um Ihren Controller in PubNub(c) zu identifizieren. Sie können zu dieser Site . gehen und kopieren Sie eine online generierte Paste-UUID.

Speichern Sie nun die Skizze und laden Sie sie hoch. Wenn Sie das Arduino IDE-Monitorfenster öffnen, können Sie Arduino Yun mit PubNub(c)-Broker verbunden und Sensor initialisiert sehen.

Testen Sie alle Äußerungen von Alexa Echo Dot

Der Alexa-Skill "Arduino Home Controller " Fähigkeit, mit dieser Liste von Äußerungen umzugehen , Sie können sie bei Alexa App Skill im Abschnitt Beschreibung sehen. Sie können alles testen und bei Arduino ID Serial Monitor alle empfangenen und an den PubNub(c)-Broker gesendeten Nachrichten anzeigen.

Lichtsteuerung:

==> "Alexa, frage arduino home, das Zimmerlicht einzuschalten"==> "Alexa, frage arduino home, das Zimmerlicht auszuschalten"==> "Alexa, frage arduino home, das Küchenlicht einzuschalten "==> "Alexa, frage arduino home, das Küchenlicht auszuschalten"==> "Alexa, frage arduino home, das Garagenlicht einzuschalten"==> "Alexa, frage arduino home, das Garagenlicht auszuschalten"==> " Alexa, bitte arduino home, das Wohnzimmerlicht einzuschalten"==> "Alexa, bitte arduino home, das Wohnzimmerlicht auszuschalten" 

Alarmsteuerung:

==> "Alexa, bitte arduino home den Wecker einzuschalten"==> "Alexa, bitte arduino home den Wecker auszuschalten" 

Scan-Temperatur und -Luftfeuchtigkeit:

==> "Alexa, frage Arduino nach Hause, um die Temperatur zu lesen"==> "Alexa, frage Arduino nach Hause, um die Luftfeuchtigkeit zu lesen" 

Machen Sie ein Sicherheitsfoto:

==> "Alexa, frage Arduino nach Hause, um ein Foto zu machen" 

Über und Hilfe

==> "Alexa, frag arduino home nach"==> "Alexa, frag arduino home help" 

Softwaredetails

Sie können alle Dateien für dieses Projekt von meiner Github-Site herunterladen.

Ordner enthält Erläuterungen

ArduinoHomeMQTT --> ino-Datei und Bibliotheken für Arduino Yun Home Controller

Lambda --> Lambda-Funktion in Node.js, die in AWS Lambda bereitgestellt werden soll, enthält alle erforderlichen node_modules, siehe Option 2 im Abschnitt zur Installation der gesamten Software.

Python --> Python-Datei zum Senden einer E-Mail mit angehängtem Foto.

Schema --> Fritzing(c) elektronische Schaltplandatei.

Arduino Home Controller-Workflow zeigen du Wie Dateien interagieren .

( 1 ) Amazon Echo Dot sendet eine Befehlsstimme und wird vom Arduino Home Controller-Skill empfangen.

( 2 ) Die Lambda-Funktionsdatei des Skillaufrufs index.js .

( 3 ) Die Lambda-Funktionsdatei ist Entwickler in Node.Js, verwendet einige Knotenmodule und wurde bei Amazon Web Service (AWS) gehostet.

( 4 ) Die Lambda-Funktion interpretiert alle Absichten und konvertiert sie in eine MQTT-Json-Nachricht und sendet sie an den PubNub(c)-Broker. Diese Nachricht hat das Format :

{ "topic" :Topic_xxxx, "command" :ein oder aus, "id" :email address} 

Das Thema Topic_xxxx kann sein:

Topic_room --> turn on/off room lightTopic_livingroom --> turn on/off living room lightTopic_kitchen --> turn on/off kitchen lightTopic_garage --> turn on/off garage lightTopic_alarm --> turn on/off alarmTopic_temperature --> read temperatureTopic_humidity --> read humidityTopic_photo --> take and send photo by email 

The command may be on or off .

( 5 ) The message is send using channel AHC_IOC_01. Channel AHC_IOC_02 is used to receive temperature or humidity values.

( 6 ) The Arduino Yun sketch ArduinoHomeMQTT.ino connect to broker and subscribe or publish to channels and receive or send messages.

( 7 ) Using a bridge the arduino sketch communicate with linux OpenWRT for wan or lan connect and to execute some commands.

( 8 ) If arduino need send an email uses the python file AHC_SendEmail.py , if needs take a photo call fswebcam programs located inside linux OpenWRT.

Hardware details

The heart of hardware is the Arduino Yun.

It uses several digital pins to control each device :

Pin 2 :connected to DHT11 sensorPin 8 :activate the buzzer alarm with help of NPN transistor Pin 9 :control room lightPin 10:control kitchen lightPin 11:control garage lightPin 12:control living room light 

The webcam is connected to usb port.

To power all devices the controller use 12 volts Dc power and convert to 5 volts using an Dc to Dc power converter.

I make an arduino shield using the Arduino Proto Shield with all connectors and interface electronic to sensor, buzzer alarm and power supply. It have space for new sensors to extending the controller.

Put the Arduino Yun, Proto shield, Relays and power regulator inside a plastic box with alarm, webcam and sensor outside, and make all connections like mention in electronic schematic.

For demo and video propose I use four leds in prothoboard simulating light bulbs in each house rooms.

Thanks for read this guide, I appreciate your time, If you have any suggestions please contact me.

I make this project in memory of my Dad, he dieds last year, R.I.P Dad.

Code

  • ArduinoHomeMQTT.ino
  • AHC_SendEmail.py
  • index.js
ArduinoHomeMQTT.inoArduino
Arduino Yun software for Home Controller
//// ArduinoHomeMQTT// v2.1//// Copyright (C)2018 Jose Cruz. All right reserved// web:https://sites.google.com/view/raeiot/home//#include #include #include #include #include // Your Amazon email linked skill#define MyID "YOUR AMAZON EMAIL LINKED IN ALEXA APP"// DHT11 sensor data pin#define DHTPIN 2// DHT 11 sensor type#define DHTTYPE DHT11// Initialize DHT sensorDHT dht(DHTPIN, DHTTYPE);// Alarm control pin#define alarm 8// Light control pins#define room_light 9#define kitchen_light 10#define garage_light 11#define livingroom_light 12// PubNub MQTT Server address and portint mqtt_server_port =1883;const char* mqtt_server ="mqtt.pndsn.com";// Suscribe topicconst char* topic ="AHC_IOT_01";// Publish topicconst char* topic2 ="AHC_IOT_02";// PubNub publisher ID// pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7/// PubNub suscriber ID// sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb/// UUID generated onlyne https://www.uuidgenerator.net/// // PubNub Client ID// clientId =pubID + subID + uuid;c onst char* clientId ="pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7/sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb/YOUR UUID GENERATED";// Define de Yun ethernet clientYunClient ethClient;// Define PubNub pub and sub clientPubSubClient client(ethClient);// Picture processProcess picture;// FilenameString filename;// Path for image fileString path ="/mnt/sda1/";// Create an image file and sent by emailvoid TakePhoto() { // Generate filename with timestamp filename =""; picture.runShellCommand("date +%s"); while (picture.running()); while (picture.available()> 0) { char c =picture.read(); filename +=c; } filename.trim(); filename +=".jpg"; // Take picture picture.runShellCommand("/usr/bin/fswebcam -i 0 --jpeg 95 --no-banner --fps 1 -S 1 -r 352x288 --save " + path + filename); while (picture.running()); //Send it by email picture.runShellCommand("python /mnt/sda1/AHC_SendEmail.py " + path + " " + filename); while (picture.running());}//***********************// Send temperature//***********************void SendTemperature(){ char cstr[16]; // Temperatur als Celsius lesen (Standard) float t =dht.readTemperature (); // Serial.print("Temperature:"); // Serial.print(t); // Serial.println(" *C"); client.publish(topic2, itoa(t, cstr, 10)); //Serial.print("Temperature sent..."); //Serial.println(cstr);}//***********************// Send humidity//***********************void SendHumidity(){ char cstr[16]; float h =dht.readHumidity(); //Serial.print("Humidity:"); //Serial.print((int)h); //Serial.print(" %\t"); client.publish(topic2, itoa(h, cstr, 10)); //Serial.print("Humidity sent..."); //Serial.println(cstr);}//Callback function for msg receive handlevoid callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i =0; i  jsonBuffer; JsonObject&root =jsonBuffer.parseObject((char[])payload); String alexa_topic =root["topic"]; String alexa_command =root["command"]; String alexa_id =root["id"]; //Serial.println(alexa_topic); //Serial.println(alexa_command); if (alexa_id.equals(MyID)) { //Handle all received msgs topic from MQTT if (alexa_topic.endsWith("Topic_room")) { digitalWrite(room_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_kitchen")) { digitalWrite(kitchen_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_garage")) { digitalWrite(garage_light, (alexa_command.endsWith("on") ? LOW :HIGH )); } else if (alexa_topic.endsWith("Topic_living room")) { digitalWrite(livingroom_light, (alexa_command.endsWith("on") ? LOW :HIGH)); } else if (alexa_topic.endsWith("Topic_temperature")) { SendTemperature(); } else if (alexa_topic.endsWith("Topic_humidity")) { SendHumidity(); } else if (alexa_topic.endsWith("Topic_alarm")) { digitalWrite(alarm, (alexa_command.endsWith("on") ? HIGH :LOW)); } else if (alexa_topic.endsWith("Topic_photo")) { TakePhoto(); } }}//Reconnect to MQTT broker if lost connectionvoid reconnect() { // Loop until we're reconnected while (!client.connected()) { Serial.print("Attempting MQTT connection..."); // Attempt to connect if (client.connect(clientId)) { Serial.println("MQTT broker connected"); client.subscribe(topic); } else { Serial.print("Failed, rc ="); Serial.print(client.state()); Serial.println(" try again in 5 seconds"); // Wait 5 seconds before retrying delay(5000); } }}void setup(){ Bridge.begin(); Verzögerung (2000); Serial.begin(115200); Serial.println("Init Arduino Home Controller v2.1..."); pinMode(alarm, OUTPUT); pinMode(room_light, OUTPUT); pinMode(kitchen_light, OUTPUT); pinMode(garage_light, OUTPUT); pinMode(livingroom_light, OUTPUT); digitalWrite(room_light, HIGH); digitalWrite(kitchen_light, HIGH); digitalWrite(garage_light, HIGH ); digitalWrite(livingroom_light, HIGH); // Define PubNub MQTT broker client.setServer(mqtt_server, mqtt_server_port); client.setCallback(callback); client.connect(clientId); Serial.println("Connected to PubNub MQTT broker OK ..."); client.subscribe(topic); Serial.println("Suscribe to topic at MQTT broker Ok ..."); dht.begin(); //Wait for sensor initialize delay(4000); Serial.println("DHT sensor Ok ...");}void loop(){ if (!client.connected()) { reconnect(); } client.loop();}
AHC_SendEmail.pyPython
File to be installed in Arduino Yun OpenWRT linux to help send email with attached photo
import smtplibimport sysimport timefrom email.MIMEMultipart import MIMEMultipartfrom email.MIMEText import MIMETextfrom email.MIMEBase import MIMEBasefrom email import encoders fromaddr ="[email protected]"toaddr ="[email protected]"emailpassword ="YOUR PASSWORD"subject ="Arduino Home Controller by Alexa Skill"body ="Photo taken in " + time.strftime('%a, %d %b %Y %H:%M:%S %Z(%z)')filedir =sys.argv[1]filename =sys.argv[2]msg =MIMEMultipart() msg['From'] =fromaddrmsg['To'] =toaddrmsg['Subject'] =subject msg.attach(MIMEText(body, 'plain')) attachment =open(filedir + filename, "rb") part =MIMEBase('application', 'octet-stream')part.set_payload((attachment).read())encoders.encode_base64(part)part.add_header('Content-Disposition', "attachment; filename=%s" % filename) msg.attach(part) server =smtplib.SMTP('smtp.gmail.com', 587)server.starttls()server.login(fromaddr, emailpassword)text =msg.as_string()server.sendmail(fromaddr, toaddr, text)server.quit()
index.jsJavaScript
AWS Lambda Function if you select option 2, build your own skill
// Alexa SDK for Arduino Home Controller// Copyright (c) 2014-2015 Amazon.com, Inc. or its affiliates. Alle Rechte vorbehalten. Use is subject to license terms.// Jose Cruz https://sites.google.com/view/jriot // Define connection to PubNub var PubNub =require("pubnub");var pubnub =new PubNub({ ssl:true, publish_key:"pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7", subscribe_key:"sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb", uuid:"YOUR UUID"});// Define the PubNub channelvar channel ='AHC_IOT_01';// Used to receive some values (temperature, humidity)var channel2 ='AHC_IOT_02';// Define slot states for light and alarm turn on/offvar slotStates =['on', 'off'];// App ID for the skillvar APP_ID ='YOUR APP ID FOR THE SKILL';// The AlexaSkill prototype and helper functionsvar AlexaSkill =require('./AlexaSkill');var ArduinoHomeSkill =function() { AlexaSkill.call(this, APP_ID);};//Listener for suscribe and receive temperature and humidityvar mqttListener;var access_token;var url;var https =require("https");function SendMessage(topicname, commandvalue, speechOutput, iresponse) { https.get(url, res => { res.setEnc oding("utf8"); let body =""; res.on("data", data => { body +=data; }); res.on("end", () => { pubnub.publish({ //Publishes the turn message to my PubHub Device. channel:channel, message:{ "topic":topicname, "command":commandvalue, "id":JSON.parse(body).email } }).then((response) => { console.log("message Published w/ timetoken", response.timetoken); if (speechOutput) iresponse.tell(speechOutput); }).catch((error) => { console.log("publishing failed w/ status:", error); iresponse.ask("Sorry, I didn't catch what you said"); }); }); });}/// Extend AlexaSkillArduinoHomeSkill.prototype =Object.create(AlexaSkill.prototype);ArduinoHomeSkill.prototype.constructor =ArduinoHomeSkill;ArduinoHomeSkill.prototype.eventHandlers.onSessionStarted =function(sessionStartedRequest, session) { // SetUserID(); console.log("ArduinoHomeSkill onSessionStarted requestId:" + sessionStartedRequest.requestId + ", sessionId:" + session.sessionId); // console.log("Init..."); //Delete all listeners and suscribes defined pubnub.removeListener(mqttListener); pubnub.unsubscribeAll(); // console.log("Init...Ok");};//-------->This is invoked by invocation word "Arduino Home"ArduinoHomeSkill.prototype.eventHandlers.onLaunch =function(launchRequest, session, response) { console.log("ArduinoHomeSkill onLaunch requestId:" + launchRequest.requestId + ", sessionId:" + session.sessionId); //if no amazon token, return a LinkAccount card if (session.user.accessToken ==undefined) { response.tellWithCardLink('To start using this skill, please use the companion app to authenticate on Amazon.'); Rückkehr; } var speechOutput ="Welcome to Arduino Home Controller. What would you like to do?"; var repromptText ="I am ready"; response.ask(speechOutput, repromptText);};ArduinoHomeSkill.prototype.eventHandlers.onSessionEnded =function(sessionEndedRequest, session) { console.log("ArduinoHomeSkill onSessionEnded requestId:" + sessionEndedRequest.requestId + ", sessionId:" + session.sessionId); console.log("End...");};//*** Define all intent handlersArduinoHomeSkill.prototype.intentHandlers ={ //*** AboutIntent handler "AboutIntent":function(intent, session, response) { var myText; console.log("in about"); myText ="Arduino Home Controller skil let you control internet connected devices. It controls Lights at room, kitchen, garage or living room), read a temperature sensor to scan home temperature, read Humidity sensor to scan home humidity, uses webcam to take a home security photo and sent it by email and activate an alarm to alert some events. It uses PubNub site to manipulate all messages send by Alexa with Lambda function. Please check information at skill page for more details. What would you like to do?"; response.ask(myText); Rückkehr; }, //*** LightIntent handler "LightIntent":function(intent, session, response) { var slotHabRooms =['room', 'kitchen', 'garage', 'living room']; var lightSlot =intent.slots.light; var lightSlotValue =lightSlot ? lightSlot.value :""; var whichSlot =intent.slots.which; var whichSlotValue =whichSlot ? whichSlot.value :""; if (lightSlotValue &&whichSlotValue &&slotStates.indexOf(lightSlotValue.toLowerCase())> -1 &&slotHabRooms.indexOf(whichSlotValue.toLowerCase())> -1) { SendMessage('Topic_' + whichSlotValue, lightSlotValue, "The light is now " + lightSlotValue, response); } else { response.ask("Sorry, I didn't catch what you said"); } }, //*** AlarmIntent handler "AlarmIntent":function(intent, session, response) { var alarmSlot =intent.slots.alarm; var alarmSlotValue =alarmSlot ? alarmSlot.value :""; if (alarmSlotValue &&slotStates.indexOf(alarmSlotValue.toLowerCase())> -1) { SendMessage('Topic_alarm', alarmSlotValue, "The alarm is now " + alarmSlotValue, response); } else { response.ask("Sorry, I didn't catch what you said"); } }, //*** TakePhotoIntent handler "TakePhotoIntent":function(intent, session, response) { SendMessage('Topic_photo', 'take', "Taken home photo ", response); }, //*** GetTemperatureIntent handler "GetTemperatureIntent":function(intent, session, response) { mqttListener ={ status:function(statusEvent) {}, message:function(message) { // handle message console.log("Receive=", message); var myText ="Inside Temperature is " + message.message + " degrees C"; response.tell(myText); }, presence:function(presenceEvent) { // handle presence } }; pubnub.addListener(mqttListener); pubnub.subscribe({ channels:[channel2] }); SendMessage('Topic_temperature', 'Ok', null, response) }, //*** GetTemperatureIntent handler "GetHumidityIntent":function(intent, session, response) { mqttListener ={ status:function(statusEvent) {}, message:function(message) { // handle message console.log("Receive=", message); var myText ="Inside Humidity is " + message.message + " %"; response.tell(myText); }, presence:function(presenceEvent) { // handle presence } }; pubnub.addListener(mqttListener); pubnub.subscribe({ channels:[channel2] }); SendMessage('Topic_humidity', 'Ok', null, response) }, //*** HelpIntent handler "AMAZON.HelpIntent":function(intent, session, response) { response.ask("With Arduino Home Controller skill and Alexa you can control internet connected devices using an Arduino Yun or Arduino with Ethernet Shield. Please check information at skill page for more details. What would you like to do?"); }, //*** StopIntent handler "AMAZON.StopIntent":function(intent, session, response) { response.tell("Thanks for using Arduino Home Controller. Bye see you later"); }, //*** StopIntent handler "AMAZON.CancelIntent":function(intent, session, response) { response.tell("Thanks for using Arduino Home Controller. Bye see you later"); }, default:function(intent, session, response) { response.ask("Try again"); },};// Create the handler that responds to the Alexa Request.exports.handler =function(event, context) { try { access_token =event['context']['System']['user']['accessToken']; url ='https://api.amazon.com/user/profile?access_token=' + access_token; //console.log("Access Token:", access_token); } catch (error) { console.log(error); } // Create an instance of Arduino Home Skill var ArduinoHomeControl =new ArduinoHomeSkill(); ArduinoHomeControl.execute(event, context); //console.log('AWSrequestID =', context.awsRequestId);};
Github
https://github.com/jcruzp/ArduinoHomeController

Schaltpläne

Main board with reles, temperature and humidity sensor, buzzer alarm and webcam.

Herstellungsprozess

  1. Webbetriebener DMX-Controller
  2. Arduino Digital Dice
  3. Arduino-Gamecontroller
  4. Pixel-Chaser-Spiel
  5. Bewässerungssystem für Heimpflanzen
  6. Arduino Repulsive Electromagnetic Levitation
  7. Vakuum-Fluoreszenz-Display-Controller
  8. Autonomer Heimassistent-Roboter
  9. NeoMatrix Arduino Pong
  10. Arduino DMX-512 Tester Controller