Pengontrol Rumah Pintar Arduino dengan Alexa: Otomasi Rumah yang Sederhana
Komponen dan Perlengkapan
Arduino Yun
×
1
ControlEverything.com 4-CHANNEL RELAY CONTROLLER FOR I2C
×
1
Sensor Suhu & Kelembaban DHT11 (4 pin)
×
1
Resistor 10k ohm
×
2
SparkFun RedBot Buzzer
×
1
Transistor NPN Tujuan Umum
×
1
LM2596 DC to DC Buck Converter
×
1
Amazon Alexa Echo Dot
×
1
Arduino Proto Shield
×
1
Usb WebCam
×
1
Kotak Perpindahan Putih 200mmx155mmx80mm
×
1
Alat dan Mesin yang Diperlukan
Paiol solder (umum)
Aplikasi dan Layanan Online
Arduino IDE
Amazon Alexa Alexa Skills Kit
Amazon Web Services AWS Lambda
PubNub Publish/Subscribe API
Tentang Proyek Ini
Ringkasan
Saat Amazon meluncur ke pasar Alexa dan perangkat seperti Amazon Echo Dot membuka sejumlah opsi tak terbatas untuk membuat Rumah Pintar yang hebat yang dikontrol oleh perintah suara menggunakan bahasa alami.
Proyek ini membuat Pengontrol Rumah Arduino yang dapat menghubungkan banyak sensor dan perangkat ke internet dan Anda dapat mengontrolnya menggunakan keterampilan Amazon Alexa.
Anda dapat menginstal dan mengaktifkan keterampilan saya "Arduino Home Controller" dengan langkah mudah, atau Anda dapat membuat keterampilan Anda sendiri dibimbing oleh tutorial ini.
Untuk saat ini kita akan mengontrol:
Empat lampu di ruangan, garasi, dapur, dan ruang tamu.
Sensor suhu dan kelembaban.
Alarm buzzer.
WebCam untuk mengambil foto keamanan dan mengirim melalui email.
Anda dapat melihat Arduino Home Controller dalam aksi dalam video demo singkat ini. Untuk tujuan demo dan video saya menggunakan empat LED di prothoboard yang mensimulasikan lampu lampu di setiap kamar rumah.
Jika Anda ingin menggunakan modul jarak jauh untuk mengaktifkan lampu Anda, Anda dapat melihat proyek "Arduino Home Controller Remote Modules" saya di URL ini.
Diagram Blok
Dalam gambar diagram blok kita dapat melihat empat komponen utama proyek ini:
1.- Amazon Echo Dot untuk menerima perintah suara dan mengirimkannya ke AWS (Amazon Web Service).
2.- AWS dengan Amazon Skill dan Lambda Function untuk menafsirkan semua perintah.
Nama keterampilan adalah "Arduino Home Controller" yang dapat Anda aktifkan nanti.
3.- Sebuah MQTT Broker menggunakan cloud PubNub(c).
Broker ini akan menerima pesan kontrol di dua saluran, satu untuk menetapkan nilai dan yang lain untuk membaca nilai dari sensor.
Anda tidak perlu membuat akun di PubNub Anda dapat menggunakan akun saya untuk tujuan demo.
4.- Home Controller menggunakan Arduino Yun.
Kami akan menggunakan Arduino Yun karena memiliki ethernet shield di dalam dan memiliki mesin linux kecil tempat kami akan menjalankan python untuk menangani beberapa tindakan.
Ini mengontrol relay untuk lampu, membaca sensor suhu dan kelembaban, menyalakan buzzer untuk alarm dan memanipulasi webcam untuk mengambil foto keamanan.
Untuk modul jarak jauh, lihat proyek komplementer saya, "Arduino Home Controller Remote Modules" di URL ini.
Instal semua perangkat lunak yang diperlukan
Titik ini Anda dapat mengambil dua opsi satu untuk tujuan demo, gunakan keterampilan Alexa saya instal dan gunakan atau opsi dua Anda dapat membuat keterampilan pribadi Anda.
Jelajahi aplikasi Alexa dengan url ini, di sana pilih bagian Skills di menu, Cari Arduino dan dalam daftar Anda melihat keterampilan dengan nama "Arduino Home Controller", klik kartu keterampilan dan klik tombol "Enable" untuk menginstal.
Atau Anda perlu pergi ke Amazon Skill Store menggunakan link ini dan tekan tombol "Enable"
Anda perlu menautkan akun Amazon Anda karena kami akan menggunakan alamat email Anda sebagai ID untuk semua perintah yang dikirim ke Arduino. Perhatikan kami tidak akan menggunakan alamat ini untuk mengirim email, hanya akan digunakan sebagai ID.
Keterampelan terinstal dan terhubung ke akun Amazon dan terhubung ke fungsi lambda saya di cloud AWS.
1.- Buat sebuah keterampilan
Anda perlu mendaftar dan membuat akun pengembang gratis di situs https://developer.amazon.com/home.html
1.1.- Setelah Login pergi ke opsi menu Alexa dan pilih di Alexa Skills Kit tombol "Get Started"
1.2.- Selanjutnya klik tombol "Add a New Skill" untuk membuat keterampilan baru.
1.3.- Di bagian Create a New Alexa Skill Anda harus:
Pilih: Custom Interaction Model
Bahasa English US
Nama TestSkill adalah nama keterampilan yang digunakan untuk mencari di toko.
Nama Panggilan Test Skill adalah nama untuk memulai perintah suara seperti Alexa Ask, Test Skill to turn alarm on
Semua bidang global atur semua ke No option
Klik "Save"
Keterampilan baru telah dibuat dan Anda melihat bidang baru Application Id
Definisikan beberapa slot yang diperlukan seperti States dan HabRooms di Custom Slot Types.
Definisikan semua utterances seperti model percakapan di Sample Utterances, salin dan tempel daftar ini.
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
Sebelum melanjutkan ke bagian berikutnya, Configuration, kita perlu telah membuat Fungsi Lambda kami karena kita perlu menautkan baik keterampilan maupun fungsi lambda.
2.- Buat Fungsi Lambda
Anda perlu mendaftar dan membuat akun di AWS Console menggunakan url https://aws.amazon.com/console/
2.1.- Pilih Services in top menu dan Lambda di bilah kiri.
2.2.- Pilih di bilah kiri Function dan klik tombol "Create function".
2.3.- Setel data ini:
Klik Author from Scratch
Nama: TestSkillLambda
Runtime: Node.js.6.10
Role: Create Custom Role
Ini akan membuka jendela baru tempat Anda harus memilih nilai berikut:
IAM Role: Lambda_Basic_Execution
PolicyName: “Create New Role Policy” lalu edit kebijakan dan tempel yang berikut:
Untuk menyimpan tekan tombol "Add" dan kembali ke halaman Create Function dan pilih lambda_basic_execution di bidang Existing role.
2.4.- Fungsi TestSkillLambda telah dibuat dan Anda melihat halaman desainnya.
2.5.- Pilih dari bilah kiri Alexa Skills Kit dan tambahkan ke area add triggers.
Klik pada kotak Alexa Skills Kit dan gulir ke bawah ke opsi Configure triggers, pilih Enable dan di bidang Skill ID salin dan tempel nilai Application ID simpan nanti, lihat bagian tutorial nomor 1.3.
Pada saat ini kita menghubungkan fungsi lambda dengan keterampilan menggunakan Application ID atau Skill ID.
Tekan tombol "Save" dan Alexa Skills Kit disimpan dan fungsi lambda mengetahui keterampilan dan terhubung.
2.6.- Gulir ke bawah ke bagian Function code dan atur bidang:
Code entry type: Upload a .zip file
Runtime: Node.js 6.10
Tekan tombol "Upload" untuk mengunggah kode fungsi menggunakan file data.zip.
Editor kode akan terbuka dan Anda akan melihat folder dan file yang diunggah.
Pilih file index.js yang berisi semua implementasi fungsi lambda.
Anda harus mengubah baris 23, salin dan tempel Application ID yang sama yang digunakan nanti di bagian tutorial nomor 1.3.
Tekan tombol "Save" dan fungsi lambda diaktifkan untuk menerima perintah keterampilan.
var APP_ID = amzn1.ask.skill.6e22e052-c32f-433c-8d39-dc94a77a4adb
Di bagian atas halaman di atas tombol "Save" Anda akan melihat ARN (Amazon Resource Name) yang merupakan ID fungsi lambda yang akan Anda gunakan di bagian Configuration di halaman Keterampilan.
3.- Kembali ke definisi Keterampilan
3.1.- Pilih bagian Configuration, di EndPoint pilih AWS Lambda ARN, salin dan tempel string ARN di atas di bidang Default. Ini adalah tindakan terakhir untuk menautkan keterampilan dan fungsi lambda, keterampilan mengetahui fungsi lambda dan terhubung.
3.2.- Gulir ke bawah ke bagian Account Linking dan salin dua Redirect URLs pertama, Anda memerlukannya untuk mengonfigurasi profil keamanan.
Sebelum melanjutkan konfigurasi Keterampilan, kita perlu mendefinisikan profil keamanan yang digunakan untuk menautkan keterampilan dan akun Amazon di aplikasi Alexa.
4.- Buat Profil Keamanan
Di konsol pengembang yang sama yang digunakan untuk membuat keterampilan, pilih Apps & Services dan Login with Amazon dan tekan tombol "Create a New Security Profile"
4.1.- Halaman Security Profile Management memungkinkan Anda membuat profil dengan semua keamanan OAuth 2.0 untuk menautkan keterampilan dengan akun Amazon Anda.
4.2.- Isi semua bidang dengan data ini:
Nama Profil Keamanan: TestSkillProfile
Deskripsi Profil Keamanan: Profil yang digunakan oleh TestSkill
URL Pemberitahuan Privasi Persetujuan: https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 ini adalah contoh Anda harus menggunakan yang Anda miliki.
Klik tombol "Save".
4.3.- Setelah menyimpan semua data atau mengedit profil keamanan dua bidang baru muncul yang menunjukkan data penting, Client ID dan Client Secret. Anda memerlukannya untuk konfigurasi keterampilan akhir.
4.4.- Definisikan whitelist urls, pilih tab Web Settings.
Allowed Origins: https://layla.amazon.com dan https://pitangui.amazon.com
Allowed Return URLs: tambahkan dua url pertama dari bagian 3.2
5.- Selesaikan pembuatan keterampilan
5.1.- Kembali ke definisi keterampilan, pilih bagian Configuration dan gulir ke bawah ke Account Linking.
Apakah Anda mengizinkan pengguna untuk membuat akun: Pilih Yes
Authorization URL: https://www.amazon.com/ap/oa/?redirect_url=UUUUUU Di mana ada “UUUUUU” Anda perlu mengganti ini dengan salah satu Redirect URL dari lebih bawah halaman. Tautan akan berakhir terlihat seperti ini https://www.amazon.com/ap/oa/?redirect_url=https://layla.amazon.com/api/skill/link/UUUUUU
Client Id: salin dan tempel Client Id dari bagian 4.3.
Client Secret: salin dan tempel Client Secret dari bagian 4.3.
Privacy Policy URL: https://www.amazon.com/gp/help/customer/display.html?nodeId=201809740 ini adalah contoh Anda harus menggunakan yang Anda miliki.
Klik tombol "Save" dan "Next"
5.3.- Global Fields adalah bagian yang digunakan untuk mendokumentasikan keterampilan.
Pilih kategori di mana menemukan keterampilan di toko saat disertifikasi, “Smart Home”
Instruksi pengujian
Keterampilan akan tersedia di semua negara.
Deskripsi singkat
Deskripsi lengkap keterampilan
Frasa contoh
Beberapa kata kunci yang mendefinisikan keterampilan
Ikon Png o Jpg 108x108 piksel
Ikon Png o Jpg 512x512 piksel
5.4.- Bagian terakhir Privacy & Compliance
6.- Instal TestSkill di aplikasi Alexa
6.1- Setelah Anda menyimpan keterampilan Anda dapat pergi ke aplikasi Alexa di https://alexa.amazon.com/ pilih di bilah kiri menu opsi Skills, klik tombol di kanan atas "Your skills" dan filter Dev Skills Anda dapat melihat kartu TestSkill. Perhatikan pesan yang diperlukan untuk penautan akun.
6.2.- Jika Anda mengklik kartu halaman deskripsi TestSkill menampilkan semua informasi tentang keterampilan, klik tombol "Enable".
6.3.- Karena definisi penautan akun yang diperlukan Anda akan diarahkan ke halaman kredensial login Amazon untuk menautkan keterampilan dengan akun Amazon Anda.
Jika informasi login divalidasi Anda melihat halaman ini yang menunjukkan bahwa keterampilan terhubung dengan akun Amazon Anda.
6.4.- Keterampilan selesai, terinstal dan terhubung ke akun Amazon Anda dan terhubung ke fungsi Lambda.
Anda dapat mencoba dengan mengatakan "Alexa, ask Test Skill" dan Anda melihat selamat datang di Arduino Home Controller karena semua dialog sama.
Konfigurasikan Arduino Yun
Jika ini pertama kali Anda menggunakan Arduino Yun Anda perlu menyiapkannya sebelum mengunggah sketsa.
Saya sarankan melihat panduan Greg Baugues atau tutorial Getting started with the Arduino Yun – the Arduino with WiFi. Terima kasih kepada pengguna Hackster @BenEagen untuk menemukan panduan ini.
Untuk mengambil foto dan mengirim email dengannya kita perlu menginstal perangkat lunak tambahan. Kami juga akan menguji kamera USB untuk melihat apakah driver berfungsi dengan benar. Silakan hubungkan kamera web USB ke port USB Arduino Yun.
Untuk melakukannya hubungkan ke Arduino Yun dengan terminal:
ssh root@yourYunName.local
Kata sandi default adalah arduino.
Jika koneksi baik Anda akan melihat prompt OpenWRT Linux:
Instal perangkat lunak pembuatan gambar
Mulai dengan pembaruan manajer paket:
opkg update
Instal driver UVC:
opkg install kmod-video-uvc
Instal paket python-openssl:
opkg install python-openssl
Kami juga memerlukan utilitas fswebcam yang akan kami gunakan untuk mengambil gambar dari terminal:
opkg install fswebcam
Pastikan kartu SD terpasang di Arduino Yun, Anda dapat mengujinya dengan menjalankan perintah ini:
mount
Jika Anda melihat dalam daftar perangkat yang seperti /dev/sda1 on /mnt/sda1 type vfat kartu SD baik.
Untuk menguji kamera dan mengambil gambar, itu sangat mudah. Cukup ketik:
cd /mnt/sda1 fswebcam test.png
Anda akan melihat beberapa informasi ditampilkan, bersama dengan beberapa kesalahan, tetapi jangan khawatir tentang itu. Hal penting adalah melihat baris-baris ini:
Untuk memeriksa apakah gambar berhasil diambil, keluarkan kartu SD dari Arduino Yun dan baca menggunakan komputer Anda. Anda akan melihat gambar muncul di root kartu SD "test.png".
Cukup buka untuk memastikan itu berhasil diambil dan tidak rusak.
Instal perangkat lunak pengiriman email
Dengan SD di komputer Anda salin file python AHC_SendEmail.py dan ubah email dan kata sandi Anda dari akun gmail pada baris 11, 12 dan 13, jika Anda memiliki penyedia email lain ubah informasi server pada baris 36.
Keluarkan SD dari komputer dan masukkan ke slot SD di Arduino Yun. Di terminal yang terhubung ke Arduino Yun, jalankan perintah:
cd /mnt/sda1 python /mnt/sda1/AHC_SendEmail.py /mnt/sda1/ test.png
Jika semuanya baik Anda harus menerima email dengan foto Anda.
Hubungkan semua perangkat ke Arduino Yun
Berdasarkan skema elektronik hubungkan semua perangkat khususnya sensor DHT11 karena kita memerlukannya untuk membaca suhu dan kelembaban dan buzzer untuk menguji suara alarm.
Instal file sketsa ArduinoHomeMQTT.ino
Saya membuat file libraries.zip dengan semua perpustakaan yang diperlukan oleh file ini, Anda dapat mengunduhnya dari situs GitHub saya dan membuka arsipnya di direktori perpustakaan Arduino IDE.
Perpustakaan yang termasuk di dalam libraries.zip di dalam folder ArduinoHomeMQTT.
ArduinoJson --> used to manipulate Json content DHT_sensor_library --> used to handle DHT sensor pubsubclient-master --> used to connect, publish and subscribe to PubNub(c)
Buka Arduino IDE 1.6.x, di tools pilih "Board: Arduino Yun".
Muat file ArduinoHomeMQTT.ino dan di IDE ubah baris 16 dengan email Amazon Anda yang digunakan saat menautkan akun di aplikasi keterampilan Amazon yang diaktifkan.
Opsi ini mengidentifikasi pengontrol Anda ketika AWS mengirim pesan MQTT ke broker.
Ubah baris 50 dengan uuid Anda untuk mengidentifikasi pengontrol Anda di PubNub(c), Anda dapat pergi ke situs ini dan salin dan tempel uuid yang dihasilkan online.
Sekarang simpan dan unggah sketsa dan saat Anda membuka jendela monitor Arduino IDE Anda dapat melihat Arduino Yun terhubung ke broker PubNub(c) dan sensor diinisialisasi.
Uji semua utterances dari Alexa Echo Dot
Keterampilan Alexa "Arduino Home Controller" menangani daftar utterances ini, Anda dapat melihatnya di bagian deskripsi keterampilan Alexa App. Anda dapat menguji semuanya dan melihat di serial monitor Arduino semua pesan yang diterima dan dikirim ke broker PubNub(c).
Kontrol lampu:
==> "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"
Kontrol alarm:
==> "Alexa, ask arduino home to turn alarm on" ==> "Alexa, ask arduino home to turn alarm off"
Pindai Suhu dan Kelembaban:
==> "Alexa, ask arduino home to read temperature" ==> "Alexa, ask arduino home to read humidity"
Ambil foto keamanan:
==> "Alexa, ask arduino home to take a photo"
Tentang dan Bantuan
==> "Alexa, ask arduino home about"==> "Alexa, ask arduino home help"
Detail perangkat lunak
Anda dapat mengunduh semua file untuk proyek ini dari situs Github saya.
Folder berisi penjelasan
ArduinoHomeMQTT --> file ino dan perpustakaan untuk Pengontrol Rumah Arduino Yun
lambda --> Fungsi Lambda di Node.js untuk diimplementasikan di AWS Lambda, termasuk semua node_modules yang diperlukan, lihat opsi 2 di bagian instal semua perangkat lunak.
python --> file python untuk mengirim email dengan lampiran foto.
schematic --> file skema elektronik Fritzing(c).
Arduino Home Controller WorkflowmenunjukkanAndabagaimana file saling berinteraksi.
( 1 ) Amazon Echo Dot mengirim perintah suara dan diterima oleh keterampilan Arduino Home Controller.
( 2 ) Keterampilan memanggil file fungsi Lambda index.js.
( 3 ) File fungsi Lambda dikembangkan di Node.Js, menggunakan beberapa node modules dan dihosting di Amazon Web Service (AWS).
( 4 ) Fungsi lambda menafsirkan semua intents dan mengonversinya ke pesan Json MQTT dan mengirimnya ke broker PubNub(c). Pesan ini memiliki format:
{ "topic" : Topic_xxxx, "command" : on atau off, "id" : alamat email }
( 5 ) Pesan dikirim menggunakan saluran AHC_IOC_01. Saluran AHC_IOC_02 digunakan untuk menerima nilai suhu atau kelembaban.
( 6 ) Sketsa Arduino Yun ArduinoHomeMQTT.ino terhubung ke broker dan berlangganan atau menerbitkan ke saluran dan menerima atau mengirim pesan.
( 7 ) Menggunakan bridge sketsa arduino berkomunikasi dengan linux OpenWRT untuk koneksi wan atau lan dan untuk menjalankan beberapa perintah.
( 8 ) Jika arduino perlu mengirim email menggunakan file python AHC_SendEmail.py, jika perlu mengambil foto panggil program fswebcam yang terletak di dalam linux OpenWRT.
Detail hardware
Jantung hardware adalah Arduino Yun.
Ini menggunakan beberapa pin digital untuk mengontrol setiap perangkat:
Pin 2 : terhubung ke sensor DHT11 Pin 8 : mengaktifkan alarm buzzer dengan bantuan transistor NPN Pin 9 : mengontrol lampu ruangan Pin 10: mengontrol lampu dapur Pin 11: mengontrol lampu garasi Pin 12: mengontrol lampu ruang tamu
Webcam terhubung ke port usb.
Untuk menyediakan daya ke semua perangkat pengontrol menggunakan daya Dc 12 volt dan mengonversi ke 5 volt menggunakan konverter daya Dc to Dc.
Saya membuat shield arduino menggunakan Arduino Proto Shield dengan semua konektor dan antarmuka elektronik ke sensor, alarm buzzer dan sumber daya. Ini memiliki ruang untuk sensor baru untuk memperluas pengontrol.
Letakkan Arduino Yun, Proto shield, Relays dan regulator daya di dalam kotak plastik dengan alarm, webcam dan sensor di luar, dan buat semua koneksi seperti yang disebutkan dalam skema elektronik.
Untuk tujuan demo dan video saya menggunakan empat LED di prothoboard yang mensimulasikan lampu lampu di setiap kamar rumah.
Terima kasih telah membaca panduan ini, saya menghargai waktu Anda, jika Anda memiliki saran silakan hubungi saya.
Saya membuat proyek ini untuk ingat kepada Ayah saya, ia meninggal tahun lalu, R.I.P Ayah.
Kode
ArduinoHomeMQTT.ino
AHC_SendEmail.py
index.js
ArduinoHomeMQTT.inoArduino
Perangkat lunak Arduino Yun untuk 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(); // 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 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"]; //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 connection void 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(); 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); // 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 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.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. 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({ //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 AlexaSkill ArduinoHomeSkill.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.'); 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 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); 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) { // 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
Skema
Papan utama dengan relay, sensor suhu dan kelembaban, alarm buzzer dan webcam.