Alexa-fähiger Arduino Home Controller: Smarte Automatisierung leicht gemacht
Komponenten und Zubehör
| Arduino Yun | × | 1 |
| ControlEverything.com 4-Kanal Relais-Controller für I2C | × | 1 |
| DHT11 Temperatur- & Feuchtigkeitssensor (4 Pins) | × | 1 |
| Widerstand 10 kOhm | × | 2 |
| SparkFun RedBot Summer | × | 1 |
| Allzweck-Transistor NPN | × | 1 |
| LM2596 DC-DC Buck Converter | × | 1 |
| Amazon Alexa Echo Dot | × | 1 |
| Arduino Proto Shield | × | 1 |
| USB-Webcam | × | 1 |
| Weiße Verteilerdose 200×155×80 mm | × | 1 |
Benötigte Werkzeuge und Maschinen
- Lötkolben (allgemein)
Apps und Online-Dienste
- Arduino IDE
- Amazon Alexa Alexa Skills Kit
- Amazon Web Services AWS Lambda
- PubNub Publish/Subscribe API
Über dieses Projekt
Überblick
Als Amazon Alexa und Geräte wie der Echo Dot auf den Markt kamen, eröffneten sich unendlich viele Möglichkeiten für ein smartes Zuhause, das per Sprachbefehl in natürlicher Sprache gesteuert wird.
Dieses Projekt realisiert einen Arduino Home Controller, der viele Sensoren und Geräte ins Internet bringt und per Amazon Alexa Skill steuerbar macht.
Sie können meinen Skill „Arduino Home Controller“ installieren und aktivieren (einfacher Weg) oder sich anhand dieses Tutorials einen eigenen Skill erstellen.
Derzeit steuern wir:
- Vier Lichter in Zimmer, Garage, Küche und Wohnzimmer
- Temperatur- und Feuchtigkeitssensor
- Summer-Alarm
- Webcam für Sicherheitsfoto mit E-Mail-Versand
Ein kurzes Video zeigt den Arduino Home Controller in Aktion. Für Demo und Video dienen vier LEDs auf Steckbrett als Simulation der Lampen in den Räumen.
Für echte Relais-Module zur Lampensteuerung siehe mein ergänzendes Projekt Arduino Home Controller Remote Modules.
Blockdiagramm
Im Blockdiagramm sehen wir die vier Hauptkomponenten:
- Amazon Echo Dot – empfängt Sprachbefehle und sendet sie an AWS.
- AWS mit Alexa Skill und Lambda-Funktion – interpretiert alle Befehle. Der Skill heißt „Arduino Home Controller“, kann später aktiviert werden.
- MQTT Broker via PubNub-Cloud – empfängt Steuerbefehle in zwei Kanälen (einmal für Setzen, einmal für Lesen von Sensorwerten). Für Demo-Zwecke kann mein PubNub-Account genutzt werden, kein eigener Account nötig.
- Home Controller mit Arduino Yun – genutzt wegen integriertem Ethernet und kleinem Linux-System, auf dem Python für bestimmte Aktionen läuft. Steuert Relais für Lampen, liest Temperatur/Feuchtigkeit, aktiviert Summer-Alarm, bedient Webcam für Sicherheitsfoto.

Alle nötige Software installieren
An diesem Punkt haben Sie zwei Optionen: Demo mit meinem Alexa-Skill (installieren und nutzen) oder eigenen Skill erstellen.
Öffnen Sie die Alexa-App unter diesem Link, wählen Sie im Menü „Skills“, suchen Sie nach „Arduino“. In der Liste finden Sie den Skill „Arduino Home Controller“, klicken Sie auf die Skill-Karte und drücken Sie „Aktivieren“.

Alternativ direkt im Amazon Skill Store über diesen Link auf „Aktivieren“ drücken.

Sie müssen Ihr Amazon-Konto verknüpfen, da wir Ihre E-Mail-Adresse als ID für alle an den Arduino gesendeten Befehle nutzen. Hinweis: Die Adresse wird nicht für E-Mails genutzt, nur als ID.



Skill ist installiert, mit Amazon-Konto verknüpft und mit meiner Lambda-Funktion in der AWS-Cloud verbunden.
1. Eigenen Skill erstellen
Registrieren Sie einen kostenlosen Entwickler-Account unter https://developer.amazon.com/home.html
1.1 Nach Login: Alexa Menü → Alexa Skills Kit → „Get Started“

1.2 „Add a New Skill“ klicken.

1.3 Bei Create a New Alexa Skill:
- Select: Custom Interaction Model
- Language: English US
- Name: TestSkill (Suchname im Store)
- Invocation Name: Test Skill (z. B. „Alexa, ask Test Skill to turn alarm on“)
- Alle globalen Felder auf „No“
- „Save“ klicken

Neuer Skill erstellt, neues Feld Application Id erscheint:
amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb
Wird für Verknüpfung Skill ↔ Lambda-Funktion genutzt (später in Abschnitt 2.5).

1.4 Interaction Model definiert Interaktion via Intents, Slots, Utterances.

Bei Interaction Model → Intent Schema folgendes JSON-Schema einfügen:
{ "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" } ] }
Nötige Slots wie States und HabRooms in Custom Slot Types definieren.



Alle Utterances (Gesprächsmodell) in Sample Utterances definieren, folgende Liste einfügen:

LightIntent Turn {which} light {light} LightIntent Set {which} light {light} AlarmIntent Turn alarm {alarm} TakePhotoIntent Take a Photo TakePhotoIntent Take Security Photo GetTemperatureIntent Read Temperature GetHumidityIntent Read Humidity AboutIntent Tell me about AboutIntent About
Bevor es mit Configuration weitergeht, muss die Lambda-Funktion erstellt sein, da beide verknüpft werden müssen.
2. Lambda-Funktion erstellen
AWS-Account registrieren: https://aws.amazon.com/console/

2.1 Services im Top-Menü → Lambda in linker Leiste.

2.2 Links Functions → „Create function“.


2.3 Daten setzen:
- Author from Scratch anklicken
- Name: TestSkillLambda
- Runtime: Node.js 6.10
- Role: Create Custom Role – neues Fenster:
- IAM Role: Lambda_Basic_Execution
- Policy Name: „Create New Role Policy“, Policy editieren und einfügen:
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:*:*:*" }, { "Effect": "Allow", "Action": [ "iot:UpdateThingShadow" ], "Resource": "*" } ] }

„Add“ drücken, zurück zu Create Function, lambda_basic_execution im Feld Existing role wählen.

2.4 TestSkillLambda Funktion erstellt, Designer-Seite sichtbar.

2.5 Links Alexa Skills Kit auswählen und zum add triggers-Bereich hinzufügen.

Auf Alexa Skills Kit Box klicken, nach unten zu Configure triggers scrollen, Enable wählen, im Feld Skill ID die Application ID aus Abschnitt 1.3 einfügen. Damit verknüpfen wir Lambda-Funktion und Skill.

„Save“ drücken – Alexa Skills Kit gespeichert, Lambda kennt Skill, beide verknüpft.

2.6 Nach unten zu Function code scrollen:
- Code entry type: Upload a .zip file
- Runtime: Node.js 6.10
- „Upload“ drücken, Datei data.zip hochladen.

Code-Editor öffnet, Ordner und Dateien sichtbar. Datei index.js wählen – enthält komplette Lambda-Implementierung.

Zeile 23 ändern: dieselbe Application ID aus Abschnitt 1.3 einfügen.
„Save“ drücken – Lambda-Funktion aktiv für Skill-Befehle.
var APP_ID = amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb
Oben über dem „Save“-Button sehen Sie den ARN (Amazon Resource Name) – die ID der Lambda-Funktion, die wir im Configuration-Abschnitt der Skill-Seite brauchen.

3. Zurück zur Skill-Definition
3.1 Configuration wählen, bei Endpoint AWS Lambda ARN auswählen, obigen ARN-String in Default einfügen. Letzter Schritt zur Verknüpfung Skill ↔ Lambda.

3.2 Nach unten zu Account Linking scrollen, die ersten beiden Redirect URLs kopieren – für Security Profile nötig.

Vor weiterem Skill-Setup: Security Profile anlegen für Verknüpfung Skill ↔ Amazon-Konto in Alexa App.
4. Security Profile erstellen
In gleicher Developer Console: Apps & Services → Login with Amazon → „Create a New Security Profile“.

4.1 Security Profile Management – Profil mit OAuth 2.0 für Skill-Account-Verknüpfung.

4.2 Felder ausfüllen:
- Security Profile Name: TestSkillProfile
- Security Profile Description: Profile used by TestSkill
- Consent Privacy Notice URL: https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 (Beispiel, eigene nutzen)
- „Save“

4.3 Nach Speichern/Bearbeiten erscheinen zwei wichtige Felder: Client ID und Client Secret – für finales Skill-Setup nötig.

4.4 Whitelist-URLs definieren, Tab Web Settings:
- Allowed Origins: https://layla.amazon.com und https://pitangui.amazon.com
- Allowed Return URLs: die zwei URLs aus Abschnitt 3.2 hinzufügen

5. Skill-Erstellung abschließen
5.1 Zurück zum Skill, Configuration → Account Linking:
- Do you allow users to create an account: Yes
- Authorization URL: https://www.amazon.com/ap/oa/?redirect_url=UUUUUU – „UUUUUU“ durch eine Redirect URL von unten ersetzen, Ergebnis z. B. https://www.amazon.com/ap/oa/?redirect_url=https://layla.amazon.com/api/skill/link/UUUUUU
- Client Id: aus Abschnitt 4.3 kopieren
- Scope: profile (Erklärung unter diesem Link)

5.2 Account Linking fortsetzen:
- Authorization Grant Type: Auth Code Grant
- Access Token URI: https://api.amazon.com/auth/o2/token
- Client Secret: aus Abschnitt 4.3 kopieren
- Privacy Policy URL: https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 (Beispiel, eigene nutzen)
- „Save“ und „Next“

5.3 Global Fields – Skill-Dokumentation:
- Kategorie im Store: „Smart Home“
- Testanweisungen
- Skill in allen Ländern verfügbar

- Kurzbeschreibung
- Vollständige Skill-Beschreibung
- Beispiel-Phrasen

- Keywords
- PNG/JPG Icon 108×108 px
- PNG/JPG Icon 512×512 px

5.4 Letzter Abschnitt Privacy & Compliance.

6. TestSkill in Alexa App installieren
6.1 Nach Speichern: Alexa App unter https://alexa.amazon.com/ → linke Leiste Skills → oben rechts „Your skills“ → Filter Dev Skills → TestSkill Karte sichtbar. Hinweis: Account Linking erforderlich.

6.2 Karte anklicken → Skill-Beschreibung → „Enable“.

6.3 Wegen Account Linking Weiterleitung zu Amazon-Login → Skill mit Amazon-Konto verknüpfen.

Login validiert → Seite bestätigt Verknüpfung.

6.4 Skill fertig, installiert, verknüpft, mit Lambda verbunden.
Testen: „Alexa, ask Test Skill“ → Willkommensmeldung „Welcome to Arduino Home Controller“ (alle Dialoge identisch).

Arduino Yun konfigurieren
Bei erstmaliger Nutzung von Arduino Yun: vorher vorbereiten vor Sketch-Upload. Ich empfehle Greg Baugues Guide „Getting started with the Arduino Yun“. Danke an Hackster-User @BenEagen für den Hinweis.
Für Fotoaufnahme und E-Mail-Versand wird zusätzliche Software benötigt. Auch USB-Kamera testen, ob Treiber funktionieren. USB-Webcam in Arduino Yun USB-Port stecken.
Per Terminal mit Arduino Yun verbinden:
ssh root@yourYunName.local
Standardpasswort: arduino.
Bei Erfolg: OpenWRT Linux Prompt.

Bild-erzeugende Software installieren
Paketmanager aktualisieren:
opkg update
UVC-Treiber installieren:
opkg install kmod-video-uvc
python-openssl installieren:
opkg install python-openssl
fswebcam-Utility für Terminal-Fotos:
opkg install fswebcam
SD-Karte in Arduino Yun gemountet prüfen:
mount

Wenn Gerätelist Eintrag wie /dev/sda1 on /mnt/sda1 type vfat zeigt: SD-Karte OK.
Kamera testen, Foto machen:
cd /mnt/sda1 fswebcam test.png
Einige Infos und Fehler erscheinen – ignorieren. Wichtig: diese Zeilen:
--- Opening /dev/video0... Trying source module v4l2... /dev/video0 opened.
Foto prüfen: SD-Karte entnehmen, am Computer lesen. Bild sollte im Wurzelverzeichnis als „test.png“ erscheinen. Öffnen, prüfen auf Korrektheit.
E-Mail-Versand-Software installieren
Auf Computer SD-Karte: Python-Datei AHC_SendEmail.py kopieren, Zeilen 11, 12, 13 mit Ihrer Gmail-Adresse und Passwort anpassen, bei anderem Anbieter Zeile 36 (Server-Info) ändern.


SD-Karte zurück in Arduino Yun. Im Terminal:
cd /mnt/sda1 python /mnt/sda1/AHC_SendEmail.py /mnt/sda1/ test.png
Bei Erfolg: E-Mail mit Foto erhalten.
Alle Geräte mit Arduino Yun verbinden
Basierend auf Schaltplan alle Geräte anschließen, besonders DHT11-Sensor (Temperatur/Feuchtigkeit) und Summer (Alarm-Test).
Sketch-Datei ArduinoHomeMQTT.ino installieren
Ich erstellte libraries.zip mit allen nötigen Bibliotheken – von GitHub herunterladen, in Arduino IDE Libraries-Verzeichnis entpacken.
Enthaltene Bibliotheken im Ordner ArduinoHomeMQTT:
ArduinoJson → JSON-Manipulation DHT_sensor_library → DHT-Sensor-Handling pubsubclient-master → PubNub-Verbindung (Connect, Publish, Subscribe)
Arduino IDE 1.6.x öffnen, unter Tools „Board: Arduino Yun“ wählen.
Datei ArduinoHomeMQTT.ino laden, in IDE Zeile 16 mit Ihrer Amazon-E-Mail anpassen (bei Skill-Account-Linking verwendet).

Diese Option identifiziert Ihren Controller, wenn AWS MQTT-Nachrichten an Broker sendet.
Zeile 50 mit Ihrer UUID anpassen (Controller-ID in PubNub) – online generieren unter dieser Seite.

Speichern und Sketch hochladen. Arduino IDE Serial Monitor öffnen → Verbindung zu PubNub-Broker und Sensor-Initialisierung sichtbar.

Alle Utterances am Alexa Echo Dot testen
Der Alexa-Skill „Arduino Home Controller“ verarbeitet folgende Utterances (in Alexa App unter Skill-Beschreibung einsehbar). Testen Sie alle und beobachten Sie im Arduino Serial Monitor alle empfangenen/gesendeten Nachrichten an PubNub.
Lichtsteuerung:
==> "Alexa, ask arduino home to turn room light on" ==> "Alexa, ask arduino home to turn room light off" ==> "Alexa, ask arduino home to turn kitchen light on" ==> "Alexa, ask arduino home to turn kitchen light off" ==> "Alexa, ask arduino home to turn garage light on" ==> "Alexa, ask arduino home to turn garage light off" ==> "Alexa, ask arduino home to turn living room light on" ==> "Alexa, ask arduino home to turn living room light off"
Alarmsteuerung:
==> "Alexa, ask arduino home to turn alarm on" ==> "Alexa, ask arduino home to turn alarm off"
Temperatur und Feuchtigkeit abfragen:
==> "Alexa, ask arduino home to read temperature" ==> "Alexa, ask arduino home to read humidity"
Sicherheitsfoto machen:
==> "Alexa, ask arduino home to take a photo"
About und Help:
==> "Alexa, ask arduino home about" ==> "Alexa, ask arduino home help"

Software-Details
Alle Dateien für dieses Projekt auf meinem GitHub.
Ordner-Inhalte erklärt
- ArduinoHomeMQTT → .ino-Datei und Libraries für Arduino Yun Home Controller
- lambda → Lambda-Funktion in Node.js für AWS Lambda, inkl. aller node_modules (Option 2 im Installationsabschnitt)
- python → Python-Datei für E-Mail-Versand mit Foto-Anhang
- schematic → Fritzing-Schaltplan
Arduino Home Controller Workflow – Datei-Interaktion
- Amazon Echo Dot sendet Sprachbefehl → empfangen von Arduino Home Controller Skill.
- Skill ruft Lambda-Funktion index.js auf.
- Lambda (Node.js, node_modules, gehostet bei AWS).
- Lambda interpretiert Intents, wandelt in MQTT-JSON-Nachricht um, sendet an PubNub Broker. Format:
{ "topic" : Topic_xxxx, "command" : on or off, "id" : email address }
Thema Topic_xxxx kann sein:
Topic_room → Zimmerlicht an/aus Topic_livingroom → Wohnzimmerlicht an/aus Topic_kitchen → Küchenlicht an/aus Topic_garage → Garagenlicht an/aus Topic_alarm → Alarm an/aus Topic_temperature → Temperatur lesen Topic_humidity → Feuchtigkeit lesen Topic_photo → Foto machen und per E-Mail senden
Befehl: on oder off.
(5) Nachricht via Channel AHC_IOT_01. Channel AHC_IOT_02 für Temperatur/Feuchtigkeit-Rückmeldung.
(6) Arduino Yun Sketch ArduinoHomeMQTT.ino verbindet mit Broker, subscribed/published Channels, empfängt/sendet Nachrichten.
(7) Via Bridge kommuniziert Arduino-Sketch mit Linux OpenWRT für WAN/LAN und Befehlsausführung.
(8) E-Mail-Versand via Python AHC_SendEmail.py, Foto via fswebcam in Linux OpenWRT.

Hardware-Details
Herzstück: Arduino Yun.
Digitale Pins für Gerätesteuerung:
Pin 2 : DHT11-Sensor Pin 8 : Summer-Alarm (via NPN-Transistor) Pin 9 : Zimmerlicht Pin 10: Küchenlicht Pin 11: Garagenlicht Pin 12: Wohnzimmerlicht
Webcam an USB-Port.
Stromversorgung: 12V DC → 5V über DC-DC-Wandler.
Ich baute einen Arduino Shield mit Proto Shield – alle Anschlüsse und Interface-Elektronik für Sensor, Summer, Netzteil. Platz für weitere Sensoren zur Erweiterung.


Arduino Yun, Proto Shield, Relais, Spannungsregler in Kunststoffbox; Alarm, Webcam, Sensor außen; alle Verbindungen laut Schaltplan.
Für Demo/Video: vier LEDs auf Steckbrett als Lampen-Simulation.




Danke fürs Lesen, ich schätze Ihre Zeit. Bei Anregungen gerne melden.
Dieses Projekt widme ich meinem Vater, der letztes Jahr verstarb. R.I.P. Dad.
Code
ArduinoHomeMQTT.ino (Arduino)
Arduino Yun Software für Home Controller
// // ArduinoHomeMQTT // v2.1 // // Copyright (C)2018 Jose Cruz. All right reserved // web: https://sites.google.com/view/raeiot/home // #include <YunClient.h> #include <PubSubClient.h> #include <ArduinoJson.h> #include <DHT.h> #include <Process.h> // 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 sensor DHT 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 port int mqtt_server_port = 1883; const char* mqtt_server = "mqtt.pndsn.com"; // Suscribe topic const char* topic = "AHC_IOT_01"; // Publish topic const 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; const char* clientId = "pub-c-e93def7f-95aa-475a-aa60-cc3cd32ee8a7/sub-c-ec04dbbc-0893-11e8-8e75-cea83f8405bb/YOUR UUID GENERATED"; // Define de Yun ethernet client YunClient ethClient; // Define PubNub pub and sub client PubSubClient client(ethClient); // Picture process Process picture; // Filename String filename; // Path for image file String path = "/mnt/sda1/"; // Create an image file and sent by email void 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]; // Read temperature as Celsius (the default) float t = dht.readTemperature(); client.publish(topic2, itoa(t, cstr, 10)); } //*********************** // Send humidity //*********************** void SendHumidity() { char cstr[16]; float h = dht.readHumidity(); client.publish(topic2, itoa(h, cstr, 10)); } //Callback function for msg receive handle void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); StaticJsonBuffer<200> jsonBuffer; JsonObject& root = jsonBuffer.parseObject((char[])payload); String alexa_topic = root["topic"]; String alexa_command = root["command"]; String alexa_id = root["id"]; if (alexa_id.equals(MyID)) { 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 connection void reconnect() { while (!client.connected()) { Serial.print("Attempting MQTT connection..."); 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"); delay(5000); } } } void setup() { Bridge.begin(); delay(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); 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(); delay(4000); Serial.println("DHT sensor Ok ..."); } void loop() { if (!client.connected()) { reconnect(); } client.loop(); }
AHC_SendEmail.py (Python)
Datei für Arduino Yun OpenWRT Linux zum E-Mail-Versand mit Foto-Anhang
import smtplib import sys import time from email.MIMEMultipart import MIMEMultipart from email.MIMEText import MIMEText from email.MIMEBase import MIMEBase from email import encoders fromaddr = "joseacruzp@gmail.com" toaddr = "joseacruzp@gmail.com" 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'] = fromaddr msg['To'] = toaddr msg['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.js (JavaScript)
AWS Lambda Funktion für Option 2 (eigener Skill)
// Alexa SDK for Arduino Home Controller // Copyright (c) 2014-2015 Amazon.com, Inc. or its affiliates. All Rights Reserved. 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 channel var 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/off var slotStates = ['on', 'off']; // App ID for the skill var APP_ID = 'YOUR APP ID FOR THE SKILL'; // The AlexaSkill prototype and helper functions var AlexaSkill = require('./AlexaSkill'); var ArduinoHomeSkill = function() { AlexaSkill.call(this, APP_ID); }; //Listener for suscribe and receive temperature and humidity var mqttListener; var access_token; var url; var https = require("https"); function SendMessage(topicname, commandvalue, speechOutput, iresponse) { https.get(url, res => { res.setEncoding("utf8"); let body = ""; res.on("data", data => { body += data; }); res.on("end", () => { pubnub.publish({ 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 AlexaSkill ArduinoHomeSkill.prototype = Object.create(AlexaSkill.prototype); ArduinoHomeSkill.prototype.constructor = ArduinoHomeSkill; ArduinoHomeSkill.prototype.eventHandlers.onSessionStarted = function(sessionStartedRequest, session) { console.log("ArduinoHomeSkill onSessionStarted requestId: " + sessionStartedRequest.requestId + ", sessionId: " + session.sessionId); pubnub.removeListener(mqttListener); pubnub.unsubscribeAll(); }; //-------->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 (session.user.accessToken == undefined) { response.tellWithCardLink('To start using this skill, please use the companion app to authenticate on Amazon.'); return; } 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 handlers ArduinoHomeSkill.prototype.intentHandlers = { //*** AboutIntent handler "AboutIntent": function(intent, session, response) { var myText; console.log("in about"); myText = "Arduino Home Controller skill 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); return; }, //*** 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) { console.log("Receive=", message); var myText = "Inside Temperature is " + message.message + " degrees C"; response.tell(myText); }, presence: function(presenceEvent) { } }; pubnub.addListener(mqttListener); pubnub.subscribe({ channels: [channel2] }); SendMessage('Topic_temperature', 'Ok', null, response) }, //*** GetHumidityIntent handler "GetHumidityIntent": function(intent, session, response) { mqttListener = { status: function(statusEvent) {}, message: function(message) { console.log("Receive=", message); var myText = "Inside Humidity is " + message.message + " %"; response.tell(myText); }, presence: function(presenceEvent) { } }; 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"); }, //*** CancelIntent 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; } catch (error) { console.log(error); } var ArduinoHomeControl = new ArduinoHomeSkill(); ArduinoHomeControl.execute(event, context); };
GitHub
https://github.com/jcruzp/ArduinoHomeController
Schaltplan
Hauptplatine mit Relais, Temperatur- und Feuchtigkeitssensor, Summer-Alarm und Webcam.
Herstellungsprozess
- Web-gesteuertes DMX-Lichtsystem – Arduino Master Controller
- Arduino Digitaler Würfel: LCD-Würfel mit Zufallszahlen (1–6)
- DIY Arduino USB Gaming Controller – Bauen Sie Ihren eigenen High-Performance Gamepad
- Pixel Chaser: Interaktives One-Tap-LED-Spiel mit Arduino Nano
- Smart-Home Pflanzenbewässerungssystem mit Arduino Nano
- Arduino-basierte abstoßende Magnetschwebung: Einfache Schaltung & DIY-Anleitung
- Arduino-basierter VFD-Ansteuerungs-Controller (Vacuum Fluorescent Display)
- Autonomer Hausassistent-Roboter bauen: Komplette Teileliste & Setup-Anleitung
- NeoPixel-Matrix Pong auf Arduino Nano: Neon-Pong selbst bauen
- Arduino DMX-512 Tester & Controller – Komplettes Bauteil-Set für zuverlässige Lichtsteuerung