Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Manufacturing Technology >> Proses manufaktur

Alexa Enabled USB Power Switch

Komponen dan persediaan

Arduino MKR1000
× 1
0.1uF 0805 Kapasitor
× 8
LED (generik)
× 4
Tekan tombol (Panjang)
× 4
INA219 (soic 8)
× 1
LM3526M
× 2
Soket USB (Vertikal)
× 4
Resistor 1k 0805
× 4
Resistor Arus Arus 0,1 Ohm
× 1
1uF 0805 Kapasitor
× 1

Alat dan mesin yang diperlukan

Printer 3D (generik)
Besi solder (generik)

Aplikasi dan layanan online

Perangkat Keterampilan Alexa Alexa Amazon
Tinamous
Layanan Web Amazon AWS Lambda

Tentang proyek ini

Alexa, Nyalakan ThingyStick...

Latar belakang

Semakin banyak perangkat yang ditenagai oleh USB, banyak dari perangkat ini cenderung menjadi perangkat "bodoh" tanpa konektivitas internet atau opsi otomatisasi rumah (misalnya lampu LED), bagaimana kita dapat mengotomatisasi atau mengontrolnya dari jarak jauh? Mungkin suplai USB dicolokkan ke sakelar listrik, itu sedikit berlebihan, terutama jika kita ingin 4 perangkat dikontrol satu per satu!

Proyek ini memungkinkan Anda untuk mengontrol catu daya ke perangkat bertenaga USB melalui internet, dan dengan menggunakan Tinamous SmartHome Skill untuk Alexa, Anda dapat mengaktifkan kontrol suara untuk perangkat USB bodoh Anda.

Saat ini sangat sedikit perangkat mereka di pasar untuk mengontrol daya USB dari jarak jauh, ketika saya memulai proyek ini, saya tidak menemukannya (di Inggris), tetapi beberapa baru-baru ini muncul sebagai bagian dari outlet multi-geng (ya, idenya dimulai sejak lama, di galaksi yang jauh), ini bukan oleh produsen otomatisasi rumah terkenal, melainkan oleh produsen tidak bermerek (yaitu ZLD-34UK) jadi kami memiliki masalah cloud perangkat siapa yang mereka gunakan, apakah data akan Cina dan sebaliknya, apa yang terjadi jika pabrikan itu tidak ada lagi, seberapa amankah, seberapa berguna perangkat lunaknya, apakah akan ada di kotak daur ulang minggu depan, dan banyak masalah normal lainnya dari perangkat yang terhubung ke Internet, belum lagi dapat diretas dengan cara yang sama seperti perangkat open source yang didukung Arduino.

Kasus Penggunaan

Contoh perangkat bertenaga USB yang mungkin ingin kami kendalikan:

  • Lampu bertenaga USB
  • Kindle Fire / Chrome cast stick (khususnya di kamar anak-anak untuk menghentikan mereka menonton TV)
  • pelembab USB
  • Echo Dot (membuat Alexa mati sendiri semalaman? atau cukup reboot perangkat)
  • Papan pengembangan. Perlu mem-boot ulang proyek itu karena kode Anda berubah menjadi infinite loop?
  • Perangkat yang sulit diakses tetapi perlu di-boot ulang sesekali (yaitu sensor di loteng).
  • Perangkat yang dipasang di lokasi klien tempat kami ingin memastikannya diberi daya (dengan mengukur konsumsi arus dan tegangan input)

Kontrol daya sederhana: Pengalihan daya yang diaktifkan Internet, baik melalui kontrol suara Alexa atau perintah lain melalui Tinamous. Aktif dan Nonaktif.

Kontrol daya pintar: Banyak lampu USB memiliki kontrol sentuh untuk menyalakan lampu, yang berarti kita tidak dapat menyalakan lampu dari jarak jauh, tetapi kita dapat mematikannya, dan seringkali hanya itu yang kita inginkan (mencoba untuk tidur, membiarkan lampu menyala ? Mau padam, mau mati semua lampunya?).

Namun, setelah kami menggunakan Alexa untuk Mematikan lampu USB, kami kemudian harus meminta Alexa untuk Menghidupkan lampu sebelum kami dapat menyalakannya, itu konyol. Dengan mengaktifkan daya pintar, perintah mati akan mematikan daya lampu selama beberapa detik sebelum memulihkan daya ke perangkat. Cukup untuk mematikan lampu, tetapi juga memungkinkan pengoperasian normal setelahnya.

Otomatis Pengatur Waktu: Minta perangkat Anda mati secara otomatis pada waktu yang ditentukan. Anak-anak menonton Amazon TV di atas api tetap terlambat? Matikan suplai USB secara otomatis pada jam 8 malam.

Pemantauan daya: Jika Anda mengembangkan perangkat keras bertenaga USB, Anda mungkin ingin tahu berapa banyak arus yang digunakan perangkat Anda, terutama saat pertama kali dinyalakan, atau Anda mungkin ingin membuat profil pengisian baterai. Dengan INA219 on-board Anda dapat memantau konsumsi saat ini (saya berhasil mengambil sampel sekitar 1kHz dengan sedikit usaha). Penurunan tegangan pada kabel USB pada arus tinggi juga dapat menjadi masalah, INA219 memonitor daya ke perangkat sehingga kami dapat memperingatkan tegangan rendah. Blok terminal juga disediakan untuk memungkinkan arus yang lebih tinggi dan kabel yang lebih besar digunakan.

Kegagalan daya: Dengan menggunakan opsi baterai pada MKR 1000 kita dapat memantau tegangan suplai USB dan mengirimkan pemberitahuan jika daya input gagal. Ini mungkin berguna untuk solusi jarak jauh (di luar lokasi) yang menggunakan daya USB tetapi memerlukan sedikit pemantauan ekstra, atau hanya sebagai pendeteksi kegagalan daya listrik sederhana untuk rumah Anda.

Perangkat Keras

Proyek ini cukup sederhana, sebuah Arduino MKR1000 di jantung, USB power switching menggunakan dua LM3526M untuk menyediakan switching sisi tinggi dan deteksi kesalahan (tegangan rendah, arus lebih), bersama dengan pemantauan daya (tegangan dan arus) menggunakan INA219, dan akhirnya LED dan sakelar untuk opsi kontrol lokal.

Saya memiliki PCB yang dibuat di DirtyPCBs.com, Anda juga dapat mengirim file .brd ke OSHPark.com untuk membuatnya juga. Soket Arduino memiliki bantalan PCB di kedua sisi setiap pin untuk memungkinkan peretasan. misalnya Anda dapat dengan mudah menambahkan beberapa sensor untuk kondisi lingkungan, atau layar OLED kecil untuk menunjukkan tegangan dan arus.

Dalam repositori github mereka adalah opsi 2 port dan 4 port. Hati-hati dengan PCB 2 port karena Saya mengacaukannya dan mendapatkan tata letak soket USB yang salah (berbalik ke depan - polaritas salah !).

Kemenangan dari rahang kekalahan:

Ternyata memasang socked USB di bagian belakang papan sebenarnya adalah solusi yang bagus dan berarti koneksi pin sudah benar (namun untuk papan 2 port itu juga berarti layar sutra berada di sisi yang salah!). Arduino dengan header di soket sedikit didorong untuk ruang dengan ketinggian yang dibutuhkan untuk mengeluarkan soket USB dari enklosur sehingga benar-benar bekerja lebih baik, saya memutuskan untuk membuat ulang papan dengan soket, sakelar, dan LED secara terbalik sisi dan untuk menambahkan dua port tambahan, maka versi empat port dibuat (juga, saya memiliki LED yang sangat sejajar pada 2 porter, sehingga diperbaiki juga!).

Mereka sangat sedikit menghentikan ini diperluas ke pengalih port 6 atau 8, meskipun LED dan sakelar mungkin perlu dijatuhkan atau ditingkatkan.

Skema terlihat jauh lebih kompleks untuk dibangun. Banyak resistor adalah opsional. Resistor R23, 19, 27 dan 26 semuanya pull-up untuk sakelar, demikian juga R20-22, R14 &R15 adalah pull-up untuk kontrol USB dan deteksi kesalahan. Ini semua dapat dilakukan melalui mode pin INPUT_PULLUP di Arduino, namun jika Anda ingin membuat Arduino tidur dengan daya rendah dan menggunakan interupsi untuk membangunkannya, Anda mungkin ingin mengisinya agar tidak mengambang (dan terpental) .

Saya juga menambahkan resistor opsional di sekitar jalur USB D+/D-. Ini dapat dipasang untuk memberi tahu perangkat berapa banyak daya yang dapat digunakan, tetapi untuk banyak perangkat bodoh ini tetap diabaikan. Di bawah ini hanya R24 untuk pembatasan arus LED yang sebenarnya diperlukan. R2-5 dan R28 dibiarkan kosong.

LED dan sakelar juga sepenuhnya opsional. Jika Anda hanya menginginkan kotak mandiri yang mengontrol USB dari jarak jauh, jangan tambahkan bagian tersebut.

Masukan Daya

Kontroler ini dapat diaktifkan melalui tiga opsi.

Yang pertama adalah opsi "Internal" (pin JP6 1 &2 terhubung), daya USB diambil dari pin 5V Arduino (dan karenanya dari konektor USB Arduino). Namun ini hanya boleh digunakan untuk beban daya rendah.

Pilihan lainnya adalah untuk daya eksternal (JP6 pin 2 &3 terhubung), Anda kemudian dapat menghubungkan 5V melalui J2 (konektor mikro USB onboard), atau JP8 (blok terminal). Anda tidak boleh menggunakan kedua opsi secara bersamaan. Daya eksternal juga disalurkan ke pin Arduino VIn sehingga tidak memerlukan opsi daya sendiri juga.

Untuk poin bonus, memasang resistor 0R ke R10 dan R11, serta J2 memberikan akses USB untuk USB 3 sehingga kami dapat mem-boot ulang perangkat yang terhubung dengan USB, sangat berguna saat mengembangkan perangkat keras dan Anda tidak ingin soket USB Anda aus PC!

Lampiran

Enklosur 3D yang dapat dicetak disertakan dengan proyek ini. Ini menggunakan sisipan heatfit M3 untuk PCB dan sambungan tutup, meskipun toleransi pada tutupnya cukup baik untuk kesesuaian gesekan.

Tutupnya mencakup beberapa opsi.

  • Dengan atau tanpa kompartemen baterai.
  • Dengan atau tanpa kaki (alias lubang pemasangan untuk memungkinkan kotak diamankan ke permukaan).

Demikian juga kotak dasar dapat dikonfigurasi (menggunakan OpenSCAD) untuk memasukkan bukaan untuk masing-masing dari tiga sumber daya.

Butuh beberapa kali untuk mendapatkan enklosur yang benar. Bagaimana Anda membuat versi cetakan Anda? Sampel saya dari klub penggemar Rigid.Ink sangat berguna.

Terhubung ke Tinamous

Kami menggunakan Arduino MKR1000 untuk mengontrol outlet, jadi kami memiliki konektivitas WiFi. Jika Anda baru menggunakan board ini, Anda perlu menambahkan opsi board ke Arduino IDE Anda.

Kami akan menggunakan server Tinamous MQTT untuk terhubung, terutama karena itu luar biasa, tetapi juga, mungkin karena saya pendiri/pengembang/pembuat teh! Kami akan berlangganan topik posting status untuk pesan yang dikirim ke perangkat. (yaitu topik "Status.To").

Sebelum memulai pengkodean, kita perlu memastikan Arduino memiliki firmware terbaru serta sertifikat SSL yang diperlukan untuk mendapatkan koneksi yang aman ke Tinamous. Jelas jika Anda mau, Anda dapat mengadaptasi ini ke server MQTT lokal Anda sendiri dan tidak terlalu mengkhawatirkan keamanan.

Langkah 1

Buka Arduino IDE dan muat FirmwareUpdater sketsa dari menu contoh WiFi101. Unggah ini ke perangkat Anda.

Langkah 2

Setelah diunggah, pilih WiFi101 Firmware Updater dari Alat menu.

Langkah 3

Uji koneksi Anda lalu Perbarui Firmware . Setelah selesai, gunakan Tambahkan domain tombol dan tambahkan tinamous.com untuk memastikan Arduino memiliki sertifikat SSL yang benar. Tekan Unggah Sertifikat ke modul WiFi tombol untuk mengunggah sertifikat.

Langkah 4

Sekarang kita bisa menulis firmware kita sendiri. Anda akan menemukan file yang dilampirkan ke proyek ini dan juga di repositori GitHub (GitHub akan memiliki versi terbaru).

Kami akan menggunakan WiFi101 dan Klien MQTT untuk sketsa Arduino Anda.

Pilih opsi MQTT oleh Joel Gaehwiler.

File secret.h perlu diisi dengan setelan WiFi dan Tinamous MQTT Anda, saya tidak menyertakan salinan saya karena alasan yang jelas.

Pengaturan Server WiFi dan MQTT:

#define SECRET_SSID "SSID Anda"#define SECRET_PASS "Kata Sandi SSID Anda"/********************** Pengaturan MQTT Tinamous *********************************/#define MQTT_SERVER ".tinamous.com"#define MQTT_SERVERPORT 8883 #define MQTT_USERNAME "UsbSwitch."#define MQTT_PASSWORD "Kata sandi Anda masuk ke sini."#define MQTT_CLIENT_ID "UsbSwitch"#define DEVICE_USERNAME "UsbSwitch" 

Jika Anda belum terdaftar di Tinamous, Anda dapat membuat akun gratis sendiri di sini. Saat Anda mendaftar, Anda akan dimintai nama Akun/Organisasi, ini menjadi area pribadi Anda sendiri di Tinamous, Anda dapat mengundang anggota lain ke area itu (termasuk Alexa), dan membagikan perangkat Anda dengan grup Anda.

Di bawah ini saya memanggil akun saya "AlexaExample", ini yang harus saya sertakan dalam pengaturan MQTT, dan akun Tinamous saya ada di https://AlexaExample.Tinamous.com

Langkah 5

Selanjutnya, kita perlu menambahkan Perangkat kita. Pada halaman Perangkat Tinamous, klik tombol Tambah.

Karenanya pengaturan Tinamous MQTT untuk perangkat saya terlihat seperti ini...

/************************* Pengaturan MQTT Tinamous *************** ******************/#define MQTT_SERVER "AlexaExample.tinamous.com"#define MQTT_SERVERPORT 8883 #define MQTT_USERNAME "UsbSwitch.AlexaExample"#define MQTT_PASSWORD "Kata sandi super rahasia saya itu sama sekali bukan Passw0rd...."#define MQTT_CLIENT_ID "UsbSwitch"#define DEVICE_USERNAME "UsbSwitch" 

Itu akun dan perangkat Tinamous kami yang diaktifkan. Anda dapat menambahkan lebih banyak perangkat di sini jika Anda mau, cukup perbarui pengaturan MQTT untuk DEVICE_USERNAME dan MQTT_USERNAME (MQTT tidak mengirim informasi header seperti http, jadi Tinamous tidak tahu sub-domain mana yang Anda gunakan, oleh karena itu kami perlu menentukan akun di nama pengguna).

Langkah 6

Unggah kode terlampir ke perangkat Anda (dengan file secret.h Anda yang diperbarui). Luangkan waktu sejenak untuk melihat file TinamousMQTTClient.ino, ini menangani interaksi MQTT kami, dan dengan itu perintah Alexa yang dikirim ke perangkat kami.

Kita harus menggunakan WiFiSSLClient untuk SSL. Jika Anda ingin menggunakan server MQTT lokal tanpa SSL, Anda dapat menggunakan Klien WiFi biasa dan turun ke port 1883, tetapi untuk apa pun yang berbasis internet, gunakan Klien SSL.

Kami juga perlu memesan sedikit lebih banyak dari buffer default untuk klien MQTT, di sini kami memesan 4096 byte.

WiFiSSLClient networkClient; MQTTClient mqttClient(4096);  

Kami menggunakan mqttClient.begin untuk menyiapkan klien dan menentukan pengendali fungsi di onMessage yang dipanggil saat pesan diterima dari server MQTT.

 mqttClient.begin(MQTT_SERVER, MQTT_SERVERPORT, networkClient); // Menangani pesan yang diterima. mqttClient.onMessage(messageReceived); 

Dan kemudian kami dapat terhubung dan berlangganan topik yang kami minati. Di sini Anda melihat kami telah berlangganan "Tinamous/V1/Status.To/UsbSwitch", kami akan menerima pesan yang dikirim ke @UsbSwitch dari timeline Tinamous. Beginilah cara kami menerima pesan dari Alexa.

if (!mqttClient.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { if (mqttClient.lastError() ==LWMQTT_CONNECTION_DENIED) { // Kesalahan ini karena nama pengguna atau sandi Anda salah } if (mqttClient. lastError() ==-6) { // Kesalahan ini kemungkinan besar karena Anda tidak menambahkan sertifikat SSL. } // Paksa penundaan sebelum mencoba kembali penundaan koneksi (10000); return false;}// Koneksi berhasil. Sekarang berlangganan topik mqttClient.subscribe("/Tinamous/V1/Status.To/" DEVICE_USERNAME); 

Anda dapat menganggap timeline Tinamous seperti Twitter versi pribadi untuk Anda dan perangkat Anda, mereka dapat menggunakan MQTT atau REST API (atau salah satu bot) untuk melihat pesan yang dikirim kepada mereka dan menindaklanjutinya, serta memposting pesan kembali.

Kami memiliki sedikit lebih banyak pekerjaan yang harus dilakukan di Tinamous untuk mengaktifkan integrasi Alexa, tetapi untuk saat ini kami dapat menguji perangkat dan firmware kami dengan menggunakan timeline dan mengirim pesan.

Jika Anda menggunakan keterampilan Tinamous SmartHome hanya itu coding yang dibutuhkan.

Keterampilan Rumah Pintar Tinamous untuk Alexa

Keterampilan Rumah Pintar Tinamous saat ini sedang menunggu persetujuan untuk diterbitkan (pada saat penulisan, semoga saja itu ada di toko sekarang ...). Untuk membuat pengalih USB sendiri, Anda cukup menggunakan Keterampilan ini jika tersedia.

Keahliannya sebenarnya sangat umum, tidak tahu apa-apa tentang perangkat atau cara berbicara dengannya. Kami menerapkan tag ke perangkat di Tinamous dan keterampilan akan membuat perangkat yang sesuai di akun Alexa, oleh karena itu, Anda dapat menggunakan keterampilan ini dan Tinamous untuk mengaktifkan suara salah satu proyek Anda sendiri hanya dengan beberapa baris kode di perangkat.

Namun, Anda mungkin ingin mengubah sesuatu, atau menulis keahlian Anda sendiri, jadi saya akan membagikan detail perkembangan saya.

Saya menulis keterampilan dalam C # untuk .Net Core 2.0, itu sebenarnya dikembangkan untuk proyek penggemar pintar BOFF saya, tetapi untuk proyek ini saya memperluasnya untuk memungkinkan perangkat memiliki banyak outlet (port) dan untuk masing-masing menjadi kelas satu warga di perangkat Alexa Smart Home.

Semua kode (termasuk beberapa tes!) ada di repositori Tinamous SmartHome, kloning, unduh atau lihat saja sesuka Anda. Saya menggunakan Visual Studio 2017 dengan alat AWS terinstal untuk membantu mendorong keterampilan ke Lambda.

Framework mendeserialize pesan arahan yang masuk dari Alexa menjadi objek yang dapat kita akses melalui kode, tindakan yang sesuai diambil berdasarkan header namespace dan nama direktif, dan kemudian respons yang sesuai dikembalikan.

Pesan utama yang menarik adalah:

  • Penautan Akun
  • Penemuan
  • Laporan Negara
  • Kontrol Daya

Penautan Akun:

Ini ditangani oleh Alexa untuk kami, setelah kami menambahkan keterampilan ke akun kami, Alexa akan meminta otentikasi, kami dibawa ke halaman Tinamous Authorize untuk memungkinkan perangkat mengakses akun kami. Di sini Anda perlu memasukkan nama akun Anda (AlexaExample dalam hal ini), nama pengguna (Steve) dan kata sandi (tidak, saya tidak memberi tahu!)

Penemuan:

Setelah akun Anda ditautkan, Alexa meminta untuk melakukan penemuan, keterampilan tersebut kemudian menanyakan Tinamous untuk perangkat yang ditandai dengan "Alexa.SmartDevice ". Perangkat tanpa ini akan diabaikan begitu saja.

Tag ini diterapkan dengan mengedit perangkat dari halaman Perangkat di Tinamous.

Jika perangkat juga ditandai dengan "MultiPort " setiap port disebutkan dan perangkat juga ditambahkan untuk itu. Kami juga menerapkan tag berdasarkan arahan Alexa yang didukung perangkat kami, ini hanya "Alexa.PowerController " dan juga tag untuk menunjukkan kategori perangkat mana yang harus ditampilkan dalam aplikasi, di sini saya telah menggunakan "SmartPlug ".

Antarmuka lain tersedia, seperti Alexa.BrightnessController, tetapi itu tidak begitu berguna di sini. Lihat readme repositori untuk detail lebih lanjut.

Agar perangkat MultiPort kami mengekspos port individual ke Alexa, kami perlu menyiapkan Variabel Status, juga di halaman edit perangkat.

PortCount menunjukkan jumlah port yang dimiliki perangkat, lalu "Port-1".."Port-n" memberikan nama yang akan digunakan Alexa untuk port tersebut. Port apa pun tanpa nama akan diabaikan. Anda dapat dengan mudah mengubah nama port di sini dan menjalankan kembali penemuan untuk memperbarui Alexa.

Selama penemuan, keterampilan juga akan mencari bidang yang diberi tag, diberi nama atau diberi label "powerState", atau "powerState-port-n" yang sesuai. Jika bidang ini ditemukan, bidang ini ditetapkan sebagai kemampuan yang didukung untuk perangkat (selengkapnya tentang ini di Laporan Negara).

Laporan Negara

Selama fase penemuan, kami memberi tahu Alexa kemampuan apa yang dimiliki perangkat kami, keterampilan default untuk memberi tahu Alexa bahwa ini dapat diminta, oleh karena itu Alexa akan mengirim permintaan StateReport untuk mendapatkan nilainya.

Kami memiliki satu set tag terakhir yang akan diterapkan untuk mendukung ini, kali ini ke bidang perangkat. Setelah perangkat Anda mengirim data (Itu adalah pesan senml yang didorong di MQTT dalam kode Arduino), Tinamous akan membuat bidang untuk perangkat. Kami kemudian dapat menggunakan opsi Lanjutan dari daftar bidang untuk mengedit ini. Menggunakan opsi tag adalah yang paling serbaguna karena itu berarti kita tidak perlu memperbaiki nama bidang di firmware atau macet jika ingin mengganti namanya.

Jika bidang khusus port tidak ditemukan, Alexa akan kembali ke bidang khusus non-port (di sini bernama powerState).

Kontrol Daya

Perangkat kami tidak akan berguna di Alexa tanpa ini! Alexa akan mengirimkan dua arahan ke Skill kami "TurnOn" dan "TurnOff". Titik masuk fungsi utama untuk keterampilan pertama-tama mencari namespace (Alexa.PowerController), lalu menyerahkan pekerjaan ke kelas pengontrol yang sesuai (PowerController.cs).

Keterampilan kemudian hanya menerbitkan Pesan Status ke timeline Tinamous.

Contoh:

@UsbSwitch Nyalakan

atau

@UsbSwitch Nyalakan port-1

Antarmuka lain yang didukung ditangani dengan cara yang hampir sama. Selanjutnya terserah perangkat kita untuk melihat pesan status ini dan melakukan tindakan. Alexa kemudian dapat membaca kembali status menggunakan StateReport.

Begitulah cara kerja keterampilan. Sekarang kita hanya perlu mendorongnya ke AWS Lambda dan membuat entri Keterampilan di konsol Alexa untuk benar-benar memberikan akses kepada Alexa.

Membuat fungsi AWS Lambda:

Saya menggunakan alat AWS dalam Visual Studio untuk mendorong keterampilan yang dikompilasi ke Lambda. Tapi pertama-tama kita perlu membuat Lambda.

Kiat pro: Buat Lambda di area AWS yang sesuai untuk bahasa yang Anda dukung. Bahasa Inggris (Inggris Raya) harus menargetkan eu-west (Irlandia).

Buat fungsi lambda baru dari awal. Cetak biru yang ada terbatas dan ketinggalan zaman (hanya mendukung V2 dari antarmuka SmartHome yang sangat berbeda dan tidak digunakan lagi - kami menggunakan V3).

Anda harus membuat peran baru untuk mengizinkan Lambda mengakses sumber daya yang dibutuhkannya. Di sini kita memilih Simple Microservices sebagai default (sebenarnya memberikan lebih dari yang kita butuhkan). Jika ternyata Anda tidak mendapatkan log di Cloud Watch, Anda mungkin juga perlu membuka dan memberikan izin peran untuk itu melalui bagian IAM.

Maka kita perlu mempublikasikan binari dari Visual Studio. Dengan alat AWS terinstal, klik kanan pada proyek dan pilih "Publikasikan ke AWS Lambda..."

Kemudian isi detail untuk ekspresi Lambda dan tekan Unggah...

Setelah diunggah, kami dapat menjalankan beberapa tes di Lambda untuk memastikannya berjalan. Kemudian kita perlu "Publikasikan versi baru" dari tarik-turun Tindakan.

Setelah dipublikasikan, kami perlu memberikan izin Keterampilan kami untuk mengakses ini,

Klik pada trigger "Alexa Smart Home" dan masukkan skill id (kami belum memilikinya....)

Membuat Keterampilan di Konsol Alexa:

Dengan Lambda kami hampir siap untuk digunakan, kami harus menuju ke konsol pengembang keterampilan dan benar-benar membuat entri untuk itu. Buka https://developer.amazon.com, pilih Alexa Skills Kit dan tambahkan Skill baru.

Pilih Smart Home Skill API, bahasa yang ingin Anda targetkan (mis. Bahasa Inggris (UK) untuk kami di Inggris Raya) dan pilih versi muatan V3 (pilihan).

Pada halaman Konfigurasi kita masuk ke detail yang lebih menarik. Masukkan Lambda ARN dari versi Lambda kami (kanan atas layar). Itu harus berakhir seperti :1 atau :2 atau :5246 (jika Anda sudah melakukan beberapa;-) ).

Sementara di Lambda kita juga dapat menempelkan "ID Aplikasi" atau "ID Keterampilan" atau "ID" atau apa pun namanya hari ini dari keterampilan, itu akan terlihat seperti amzn1.ask.skill.2_______________50.

Pastikan untuk mengklik Simpan setelah Anda menambahkan ID Aplikasi. Di konsol lama Anda dapat menemukan id di header di bawah nama keterampilan, di baru, erm, buka jendela baru, kembali ke daftar keterampilan konsol, dan klik tautan yang sesuai. (seolah-olah mereka tidak pernah menggunakan konsol untuk benar-benar membuat keterampilan).

Untuk mengaktifkan penautan akun, kita memerlukan aplikasi OAuth yang dibuat di Tinamous, ini dilakukan dengan menggunakan Bot Alexa. Buka halaman Bot akun Tinamous Anda dan tambahkan Bot Alexa. Setelah Anda membuatnya, kotak dialog akan memberikan semua detail yang Anda perlukan untuk mengonfigurasi penautan akun.

NB:Jika Anda menggunakan keterampilan Tinamous SmartHome (segera...) yang diterbitkan, Anda tidak memerlukan Bot Alexa.

Aplikasi yang dibuat oleh bot akan memungkinkan pemegang akun Tinamous lainnya untuk menggunakan keahlian Anda dan menautkan akun mereka. Tentu saja Anda tidak perlu mempublikasikan keahlian Anda dan Anda dapat merahasiakannya, dan mereka tidak akan dapat melihat apa pun di akun Tinamous Anda.

Demikian juga jika Anda menggunakan cloud perangkat yang berbeda (serius, mengapa Anda melakukan itu;-) ), maka Anda harus memasukkan detail aplikasi OAuth mereka.

Pada halaman Tes, pastikan keahlian Anda disetel ke "Ya" untuk "Tampilkan keahlian ini di Aplikasi Alexa".

Simpan dan buka alexa.amazon.co.uk (atau yang sesuai untuk wilayah Anda), atau ternyata aplikasi mereka juga.....

Klik pada "Keterampilan", lalu kanan atas, "Keterampilan Anda", dan kemudian "KEMAMPUAN DEV", Anda akan melihat keahlian Anda terdaftar dengan penanda hijau untuk menunjukkan itu adalah keterampilan pengembangan.

"Alexa, matikan lampu usb", dan informasi keterampilan tambahan ketika Anda memilihnya dikonfigurasi pada halaman "Informasi Penerbitan", Anda dapat memasukkan info selama pengembangan tanpa harus pergi untuk penerbitan penuh.

Jika Anda perlu memperbarui kode keterampilan, unggah fungsi Lambda baru, buat versi baru, tambahkan kembali pemicu SmartHome dan ID Keterampilan, lalu tempelkan fungsi Lambda berversi ke konsol keterampilan (Anda mungkin dapat menggunakan non- versi lambda, tetapi tidak berhasil ketika saya mencoba - meskipun ada banyak hal lain yang saya juga salah saat itu).

Success!

With our skill code is running in Lambda and the Skill installed in our Alexa account, we can run discovery, and then start controlling the devices.

You can click over to the CloudWatch logs to see the log information written by your skill.

Skill Debugging &Tips

Alexa provides next to no developer feedback when things go wrong, you can spend ages guessing why Alexa doesn't do as you hoped.

  • Avoid most things other than alpha-numerics in your endpointID's (I used * at one stage and everything broke, but not in an obvious way, however # was fine. Go figure!).
  • Log everything. Check for logs when you've invoked your skill. No log then it's probably authentication, or your skill isn't authorized for the Lambda expression.
  • Use matching AWS and Alexa email accounts.
  • Keep the Lambda in the same region as the skill (Ireland for UK skills).
  • If your skill is invoked but Alexa isn't responding to it (i.e. not listing devices), your response format is probably wrong.
  • If you don't want to use your day to day Alexa account you can use Amazon households to add a second adult account. Note however this appears to be limited to 2 adults, and you can't change it without an epic delay.
  • You can ask "Alexa, Switch Profiles" to switch between your developer and regular profiles.
  • I hope with the redesign of the Alexa Console some better debugging information will be available. However right now all I see is bigger boxes and a little better validation. Some logs are available but they are just success logs. aka management level feel good metrics, and delayed by 36 hours which isn't helpful for debugging!

One Skill, Any (IoT) Thing!

With the Tinamous SmartHome skill, as long as your (Internet of Things) thing can connect to the Tinamous MQTT server (or is connected via a supported bot) adding Alexa SmartHome control to your thing is simply a few lines of code to handle messages like "Turn On", "Turn Off", "Set brightness 20". Just add the tags in Tinamous, and....

"Alexa, Discover Smart Home Devices".

Kode

  • AlexaUsbSwitcher.ino
  • TinamousMQTTClient.ino
  • UsbControl.ino
  • WiFiClient.ino
  • Secrets.h
AlexaUsbSwitcher.inoArduino
This is the main file.
#include #include #include #include // Provide your own Secrets.h with WiFi and Tinamous definitions in it.#include "Secrets.h"// ================================/*#define MAX_USB_PORTS 2// 2 Port board.int led_pin[MAX_USB_PORTS][2] ={{A5, A6},{0,1}};int switch_pin[] ={A0, A1};// Usb switch B channel -> pin 5 ==USB1int usb_enable_pin[] ={2, 5};int usb_fault_pin[] ={3, 4};bool usb_port_state[] ={false, false};bool usb_power_mode[] ={0, 0, 1, 1};*/// ---------------------------------// 4 Port board.#define MAX_USB_PORTS 4// The 2 port board has bi-color LEDs, 4 port doesn't so use same pin......// LEDs:TX, Rx, D7, D6 (1-4)int led_pin[MAX_USB_PORTS][2] ={{14, 14}, {13,13}, {7,7}, {6,6}};int switch_pin[] ={A0, A1, A2, A3};// USB Enable pins, D1, D3, D4, D5 (not in that order)int usb_enable_pin[] ={5, 4, 1, 3};// Single fault pin (D2)int usb_fault_pin[] ={2, 2, 2, 2};bool usb_port_state[] ={false, false, false, false};// Mode:0 - Switch off as requested.// Mode:1 - Switch off, then on after a delay (useful for LED lights that have touch controls).int usb_power_mode[] ={1, 0, 0, 0};// ================================// Automation options.// time (millis) that the USB port should be switched on/off at.// zero indicates ignore.unsigned long usb_power_switch_on_at[] ={0, 0, 0, 0};// Set> 0 to get processed on first loop.// Side effect is switching them off that those in smart power // mode will schedule to come back on again).unsigned long usb_power_switch_off_at[] ={1, 1, 1, 1};// Current monitor INA219Adafruit_INA219 ina219;// Flag to indicate if one or more USB ports has a fault.bool has_usb_fault =false;// Measured power .float shunt_voltage =0;float bus_voltage =0;float current_mA =0;float load_voltage =0;float power_mW =0;// Min/max float max_current_mA =0;float max_busvoltage =0;float min_busvoltage =20;// track power usage.unsigned long last_measurement_time =0;bool power_failed =false;bool over_current =false;// MQTT publishing.// Probably want it quicker when powering devices.// or slower when not!int update_interval_seconds =20;unsigned long next_message_send_at =0;// =================================================// Main setup entry point// =================================================void setup() { pinMode(LED_BUILTIN, OUTPUT); digitalWrite(LED_BUILTIN, HIGH); for (int channel=0; channel MAX_USB_PORTS) { return; } // Light up the LED (1..4) based on the setup progress. SetLeds(stage-1 , true, true);}// ===================================================// Main Loop// ===================================================void loop() { // 4 port device, Debug LED is port 4 LED. // if any port 4 is on, then don't switch off the LED. // with all 4 ports off, the debug LED can blink as it likes... if (!hasPoweredPorts()) { digitalWrite(LED_BUILTIN, LOW); } // Check for a fault. bool faulted =false; for (int channel =0; channel  max_current_mA) { max_current_mA =current_mA; } if (bus_voltage> max_busvoltage) { max_busvoltage =bus_voltage; } if (bus_voltage  4.5) { Serial.print("External power restored. Bus voltage:"); Serial.print(bus_voltage); Serial.println(" V"); publishTinamousStatus("External power has been restored."); power_failed =false; } if (bus_voltage <4.2 &&!power_failed) { Serial.print("External power failed! Bus voltage:"); Serial.print(bus_voltage); Serial.println(" V."); publishTinamousStatus("External power lost!"); power_failed =true; } if (over_current &¤t_mA <1500) { publishTinamousStatus("Current fault cleared!"); over_current =false; } if (current_mA> 2000 &&!over_current) { // Overload! publishTinamousStatus("Over Current!"); over_current =true; } }void printPowerWide() { Serial.print("Bus Voltage:\t"); Serial.print(bus_voltage); Serial.print(" V\t"); Serial.print("Current:\t"); Serial.print(current_mA); Serial.print(" mA\t"); Serial.print("Max Current:\t"); Serial.print(max_current_mA); Serial.print(" mA\t"); Serial.print("Min Voltage:\t"); Serial.print(min_busvoltage); Serial.print(" V\t"); Serial.print("Max Voltage:\t"); Serial.print(max_busvoltage); Serial.print(" V\t"); Serial.println();}void printPowerSkinny() { Serial.print(bus_voltage); Serial.print("\t"); Serial.print(current_mA); Serial.print("\t\t"); Serial.print(max_current_mA); Serial.print("\t\t"); Serial.print(min_busvoltage); Serial.print("\t"); Serial.print(max_busvoltage); Serial.print("\t"); Serial.print("["); for (int channel=0; channel next_message_send_at) { Serial.println("------------------------"); Serial.println("MQTT publish measurements"); if (power_failed) { // reduce how often we send when the power // has failed to preserve battery power. sentNextPublishAt(update_interval_seconds * 10); } else { sentNextPublishAt(update_interval_seconds); } // And do one as senml... String senml ="{'e':["; // Voltage senml =senml + "{'n':'busVoltage'"; senml =senml + ", 'v':"; senml =senml + String(bus_voltage); senml =senml + ", 'u':'V'}"; // Max voltage senml =senml + ",{'n':'maxBusVoltage'"; senml =senml + ", 'v':"; senml =senml + String(max_busvoltage); senml =senml + ", 'u':'V'}"; // Min voltage senml =senml + ",{'n':'minBusVoltage'"; senml =senml + ", 'v':"; senml =senml + String(min_busvoltage); senml =senml + ", 'u':'V'}"; // Current senml =senml + ",{'n':'Current'"; senml =senml + ", 'v':"; senml =senml + String(current_mA); senml =senml + ", 'u':'mA'}"; // Max current senml =senml + ",{'n':'MaxCurrent'"; senml =senml + ", 'v':'"; senml =senml + String(max_current_mA); senml =senml + "', 'u':'mA'}"; // mAh consumed... senml =senml + ",{'n':'mAh'"; senml =senml + ", 'v':"; senml =senml + String(0); // TODO! senml =senml + ", 'u':'mAh'}"; senml =senml + ",{'n':'powerState"; senml =senml + "', 'bv':"; if (isPowered()) { senml =senml + "true"; } else { senml =senml + "false"; } senml =senml + "}"; for (int channel=0; channel 0 &&onAt  0 &&offAt  
TinamousMQTTClient.inoArduino
This file handled the MQTT connectivity (i.e. it's the bit that responds to Alexa commands).
// ======================================// Tinamous connectivity via MQTT// ======================================#include #include #include "secrets.h"// WiFi and MQTT settings in Secrets.h// Be sure to use WiFiSSLClient for an SSL connection.// for a non ssl (port 1883) use regular WiFiClient.//WiFiClient networkClient; WiFiSSLClient networkClient; // https://github.com/256dpi/arduino-mqtt// Specifying 4096 bytes buffer sizeMQTTClient mqttClient(4096); // If we have been connected since powered up bool was_connected =false;String senml ="";unsigned long nextSendMeasurementsAt =0;// =================================================// Setup the MQTT connection information// =================================================bool setupMqtt() { senml.reserve(4096); Serial.print("Connecting to Tinamous MQTT Server on port:"); Serial.println(MQTT_SERVERPORT); Serial.print("Server:"); Serial.println(MQTT_SERVER); mqttClient.begin(MQTT_SERVER, MQTT_SERVERPORT, networkClient); // Handle received messages. mqttClient.onMessage(messageReceived); connectToMqttServer();}// =================================================// Connect to the MQTT server. This can be called // repeatedly and will be ignored if already connected// =================================================bool connectToMqttServer() { if (mqttClient.connected()) { return true; } Serial.println("Reconnecting...."); Serial.println("checking wifi..."); if (WiFi.status() !=WL_CONNECTED) { Serial.print("WiFi Not Connected. Status:"); Serial.print(WiFi.status(), HEX); Serial.println(); penundaan (10000); kembali salah; } Serial.println("Connecting to MQTT Server..."); if (!mqttClient.connect(MQTT_CLIENT_ID, MQTT_USERNAME, MQTT_PASSWORD)) { Serial.println("Failed to connect to MQTT Server."); Serial.print("Error:"); Serial.print(mqttClient.lastError()); Serial.print(", Return Code:"); Serial.print(mqttClient.returnCode()); Serial.println(); if (mqttClient.lastError() ==LWMQTT_CONNECTION_DENIED) { Serial.println("Access denied. Check your username and password. Username should be 'DeviceName.AccountName' e.g. MySensor.MyHome"); } if (mqttClient.lastError() ==-6) { Serial.println("Check your Arduino has the SSL Certificate loaded for Tinmaous.com"); // Load the Firmware Updater sketch onto the Arduino. // Use the Tools -> WiFi Firmware Updater utility } // Wait 10s before it gets re-tried. penundaan (10000); kembali salah; } Serial.println("Connected to Tinamous MQTT!"); mqttClient.subscribe("/Tinamous/V1/Status.To/" DEVICE_USERNAME); Serial.println("Subscribed to status.to topic."); // Say Hi. publishTinamousStatus("Hello! Usb switch is now connected. @ me with help for help."); was_connected =true; return true;} // =================================================// Loop for mqtt processing.// =================================================void mqttLoop() { // Call anyway, does nothing if already connected. connectToMqttServer(); mqttClient.loop(); }// =================================================// Publish a status message on the Tinamous timeline// =================================================void publishTinamousStatus(String message) { Serial.println("Status:" + message); mqttClient.publish("/Tinamous/V1/Status", message); }// =================================================// Publish measurements using the plain json format// =================================================void publishTinamousJsonMeasurements(String json) { Serial.println("Measurement:" + json); mqttClient.publish("/Tinamous/V1/Measurements/Json", json); }// =================================================// Publish measurements using senml json format// =================================================void publishTinamousSenMLMeasurements(String senml) { Serial.println("SenML Measurement:" + senml); mqttClient.publish("/Tinamous/V1/Measurements/SenML", senml); if (mqttClient.lastError() !=0) { Serial.print("MQTT Error:"); Serial.print(mqttClient.lastError()); Serial.println(); } Serial.println("Done.");}// =================================================// Message received from the MQTT server// =================================================void messageReceived(String &topic, String &payload) { Serial.println("Message from Tinamous on topic:" + topic + " - " + payload); // If it starts with @ it's a status message to this device. if (payload.startsWith("@")) { payload.toLowerCase(); if (handleStatusMessage(payload)) { Serial.println("@ me status message handled."); kembali; } } // Didn't get an expected command, so the message was to us. // Publish a help message. publishTinamousStatus("Hello! Sorry I didn't understand the message. @ me with help for help.");} // =================================================// Message was a Status Post (probably Alexa)// =================================================bool handleStatusMessage(String payload) {char buffer[25]; // for 1..4 (maps to 0..3) for (int port =0; port  0) { Serial.print("Turn on port "); Serial.println(port); setUsb(port, true); kembali benar; } sprintf(buffer, "turn off port-%01d", port + 1); if (payload.indexOf(buffer)> 0) { Serial.print("Turn off port "); Serial.println(port); setUsb(port, false); kembali benar; } } // No port specified, turn on all. if (payload.indexOf("turn on")> 0) { allOn(); kembali benar; } if (payload.indexOf("turn off")> 0) { allOff(); kembali benar; } if (payload.indexOf("help")> 0) { Serial.println("Sending help..."); publishTinamousStatus( "Send a message to me (@" DEVICE_USERNAME ") then:" "'Turn on Port-1' to turn on usb port 1," "'Turn off Port-1' to turn off usb port 1," "'Turn on' to turn on all usb ports," "'Turn off' to turn off all usb ports," " \n* Port number can be 1, 2, 3 or 4." ); kembali benar; } Serial.print("Unknown status message:"); Serial.println(payload); return false;}
UsbControl.inoArduino
This file is responsible for the iterations with the USB power switching.
// ======================================// USB Port power control// and indication.// ======================================// Determine if one or more of the ports is poweredbool hasPoweredPorts() { for (int channel =0; channel  
WiFiClient.inoArduino
This file deals with WiFi Connectivity
// ======================================// WiFi handling// ======================================#include "Secrets.h" char ssid[] =SECRET_SSID; char pass[] =SECRET_PASS; int status =WL_IDLE_STATUS; void setupWiFi() { Serial.println("Connecting to WiFi..."); // check for the presence of the shield:if (WiFi.status() ==WL_NO_SHIELD) { Serial.println("WiFi shield not present"); // don't continue:while (true); } // attempt to connect to WiFi network:while ( status !=WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID:"); Serial.println(ssid); // Connect to WPA/WPA2 network:status =WiFi.begin(ssid, pass); // tunggu 10 detik untuk koneksi:delay(10000); } // you're connected now, so print out the data:Serial.println("You're connected to the network"); printCurrentNet(); printWiFiData();}// ---------------------------------------// WiFivoid printWiFiData() { // print your WiFi shield's IP address:IPAddress ip =WiFi.localIP(); Serial.print("IP Address:"); Serial.println(ip); Serial.println(ip); // print your MAC address:byte mac[6]; WiFi.macAddress(mac); Serial.print("MAC address:"); Serial.print(mac[5], HEX); Serial.print(":"); Serial.print(mac[4], HEX); Serial.print(":"); Serial.print(mac[3], HEX); Serial.print(":"); Serial.print(mac[2], HEX); Serial.print(":"); Serial.print(mac[1], HEX); Serial.print(":"); Serial.println(mac[0], HEX);}void printCurrentNet() { // print the SSID of the network you're attached to:Serial.print("SSID:"); Serial.println(WiFi.SSID()); // print the MAC address of the router you're attached to:byte bssid[6]; WiFi.BSSID(bssid); Serial.print("BSSID:"); Serial.print(bssid[5], HEX); Serial.print(":"); Serial.print(bssid[4], HEX); Serial.print(":"); Serial.print(bssid[3], HEX); Serial.print(":"); Serial.print(bssid[2], HEX); Serial.print(":"); Serial.print(bssid[1], HEX); Serial.print(":"); Serial.println(bssid[0], HEX); // print the received signal strength:long rssi =WiFi.RSSI(); Serial.print("signal strength (RSSI):"); Serial.println(rssi); // print the encryption type:byte encryption =WiFi.encryptionType(); Serial.print("Encryption Type:"); Serial.println(encryption, HEX); Serial.println();}String hostName ="www.google.com";void doPing() { Serial.print("Pinging "); Serial.print(hostName); Serial.print(":"); int pingResult =WiFi.ping(hostName); if (pingResult>=0) { Serial.print("SUCCESS! RTT ="); Serial.print(pingResult); Serial.println("ms"); } else { Serial.print("FAILED! Error code:"); Serial.println(pingResult); }} void reconnectWiFi() { // attempt to reconnect to WiFi network if the connection was lost:while ( status !=WL_CONNECTED) { Serial.print("Attempting to connect to WPA SSID:"); Serial.println(ssid); // Connect to WPA/WPA2 network:status =WiFi.begin(ssid, pass); if (status ==WL_CONNECTED) { Serial.print("You're re-connected to the network"); printCurrentNet(); printWiFiData(); kembali; } delay(5000); } }
Secrets.hArduino
You need to update this with your own settings.
#define SECRET_SSID ""#define SECRET_PASS ""/************************* Tinamous MQTT Setup *********************************/#define MQTT_SERVER ".tinamous.com"#define MQTT_SERVERPORT 8883 #define MQTT_USERNAME "."#define MQTT_PASSWORD "The devices password"#define MQTT_CLIENT_ID "A random client id"#define DEVICE_USERNAME ""

Suku cadang dan penutup khusus

This is the best bet if you don't know how you'll connect. It's got holes for the Arduino, terminal block and additional USB micro.This is the all connectors version, but doesn't include the first layers of text which some printers may struggle with.This is the simplest version and quickest to print.

Skema

Send this off to OSHPark or DirtyPCBs to get your own one made. arduinostandaloneusbswitch-4port_q16AoF01Aq.brd arduinostandaloneusbswitch-v2_Xd45dtjndI.sch
GitHub USB Power Switcher Repository
You want:Arduino/StandAlone/ folder and the 4 port version.https://github.com/ThingySticks/USBPowerSwitcher

Proses manufaktur

  1. Pernyataan sakelar C#
  2. Pengisi daya baterai menawarkan kepadatan daya yang lebih besar, pengisian daya yang lebih cepat
  3. Sensor Pemadaman Listrik
  4. Raspberry Pi / Hologram SMS Sakelar Daya AC Terkendali
  5. Tenaga angin
  6. Panduan untuk Power Hammer
  7. Apa itu Power Press Otomatis?
  8. Apa itu Power Chuck?
  9. Panduan Cepat untuk Power Chuck
  10. Memahami pembangkit listrik tenaga air