İçindekiler:

Raspberry Pi Projesine Özel Alexa Kontrolü Ekleyin: 5 Adım
Raspberry Pi Projesine Özel Alexa Kontrolü Ekleyin: 5 Adım

Video: Raspberry Pi Projesine Özel Alexa Kontrolü Ekleyin: 5 Adım

Video: Raspberry Pi Projesine Özel Alexa Kontrolü Ekleyin: 5 Adım
Video: AKILLI CİHAZLARINIZI TEK YERDEN YÖNETİN | Home Assistant (Hassio) kurulumu 2024, Temmuz
Anonim
Raspberry Pi Projesine Özel Alexa Kontrolü Ekleme
Raspberry Pi Projesine Özel Alexa Kontrolü Ekleme

Bu proje, Python kullanan ve mevcut Amazon Echo cihazları aracılığıyla ses kontrolü eklemek isteyen Raspberry Pi projesine sahip herkes için tasarlanmıştır. Deneyimli bir programcı olmanıza gerek yok, ancak komut satırını kullanmakta ve mevcut kodu ihtiyaçlarınıza göre uyarlamakta rahat olmalısınız.

Başlangıçta Raspberry Pi'min Alexa ile sesle kontrol edilmesini ve böylece bir su ısıtıcısındaki suyu belirli bir sıcaklığa kadar ısıtabilmesini sağlamak için bir projeye başladım. İstediğim etkileşim oldukça basit olmasına rağmen (Alexa'dan Raspberry Pi'ye bir sayı iletmek), mevcut öğreticilerden bu duruma ulaşmak çok fazla çalışma gerektirdi. Umarım bu eğitim, bu süreci başkaları için olabildiğince hızlı hale getirir.

Örneğimde, Raspbian ile bir Raspberry Pi Zero W ile başlıyorum. Pi'mde bir SPI ekranına metin yazabilen bir Python3 programım ve okuyabileceğim bir termometre sondam var. Sizin için bu program hemen hemen her şey olabilir, ancak fikir şu ki, Alexa aracılığıyla okumak istediğiniz bazı giriş cihazlarınız ve/veya Alexa kullanarak kontrol etmek istediğiniz bazı çıkış cihazlarınız olabilir.

Amaç, yukarıda anlatılan gibi basit bir programdan benim Echo ile kolayca kontrol edebileceğiniz bir cihaza geçmek. Bu donanıma zaten sahip olduğunuzu varsayarsak, bu proje size herhangi bir maliyet getirmemelidir. Sonunda, şöyle şeyler söyleyebileceğiniz noktaya geleceksiniz:

Ben: "Alexa, aygıtımdan sensör 1'deki sıcaklığı kontrol etmesini isteyin."

Alexa'nın yanıtı: "Sonda 72.31 derece okuyor."

veya

Ben: "Alexa, cihazıma George Washington yazmasını söyle"

Yanıt: Raspberry Pi'me bağlı olan ekranda artık "George Washington" yazıyor

Bir sonraki bölümde, bu işi yapmak için perde arkasında ne olması gerektiğini anlatacağım. Bunun projeniz üzerinde çalışmasını istiyorsanız ve nasıl çalıştığını umursamıyorsanız, atlamaktan çekinmeyin (bir şeyler ters giderse daha da zorlaştırabilir).

Adım 1: Arka Plan

Arka plan
Arka plan

Bu görüntüde (kredi: https://developer.amazon.com/en-US/docs/alexa/alex… Alexa Gadget'larının genel mimarisini görebiliriz.

Echo cihazınıza bir şey söylediğinizde, sesi işlendiği ve size yanıt vermek için bir yanıtın oluşturulduğu Alexa Cloud'a gönderir. Hava nasıl diye sorduğunuzda iletişim halinde olan sadece bu ikisidir. Şimdi, bir Raspberry Pi'deki küçük projelerinizden birine ses kontrolü eklemek istediğinizi varsayalım. Her şeyi yerleşik olarak işlemek, işlerin yürümesi için önemli bir donanım ve çok karmaşık bir kod tabanı gerektirir. Daha iyi bir çözüm, çok karmaşık olan ve karmaşık konuşma kalıplarını işlemede çok başarılı olan Alexa Cloud'dan yararlanmak olacaktır. Alexa Gadget'ları bunu yapmanız için iyi bir yol sağlar.

Bir Alexa Gadget, bluetooth kullanarak bir Echo cihazıyla iletişim kurar. Bu bağlantı kurulduğunda, ikisi UTF-8 kodlamasını kullanarak birbirlerine mesaj iletirler. Yankı, gadget'a bir şey ilettiğinde, buna yönerge denir. Diğer yöne ise olay denir. Tüm bunların tam akışına girmeden önce, başka bir temel öğeyi tanıtmalıyız: özel Alexa Becerileri.

Alexa, geliştiricilerin tüm Echo cihazlarında kullanım için kendi etkileşimlerini ve davranışlarını tasarlamalarına olanak tanıyan kendi özel becerilerini oluşturmalarına olanak tanır. Örneğin, bir geliştirici size ABD'deki iki havaalanı arasındaki mesafeyi söylemek için özel bir beceri oluşturabilir. Bir kullanıcı şöyle derdi: "Alexa, özel mesafe hesaplayıcıma LAX ve JFK arasındaki mesafeyi sor" ve "2475 mil" ile yanıt verebilir. Bunu nasıl yapar? Bir geliştirici özel bir beceri yaptığında, "yuvalar" içeren "örnek ifadeler" ile "özel amaçlar" olarak adlandırılanları tanımlar. Örneğin, bu beceride iki nokta arasındaki mesafeyi hesaplamak için "calc_dist" amacına sahip olabilirim. Örnek bir ifade "{slot1} ile {slot2} arasındaki mesafe nedir" veya "{slot1} ile {slot2} arasındaki mesafe ne kadar" olabilir. Parantez içinde gösterilen yuvaların belirli türleri vardır. Bu durumda bu tipler LAX, JFK, BOS, ATL gibi havalimanı kodları olacaktır. Bir kullanıcı özel beceri istediğinde, Alexa Cloud, sağlanan örnek ifadeleri kullanarak kullanıcının söylediklerini özel bir niyetle eşleştirmeye çalışır ve bu istek için geçerli yuva değerleri bulmaya çalışır. Bu örnekte, kullanıcının "calc_dist" amacını istediğini ve slot1'in LAX ve slot2'nin JFK olduğunu bulacaktır. Bu noktada, Alexa Cloud işi geliştiricinin kendi koduna devreder. Temel olarak, geliştirici koduna, diğer ayrıntıların yanı sıra, hangi amacı aldığını ve tüm slot değerlerinin ne olduğunu söyler.

Geliştirici, kodunun nerede olacağına karar verir, ancak çok popüler bir seçenek, bir AWS Lambda işlevi kullanmaktır. Bunun ne olduğunu bilmiyorsanız, esasen herhangi bir zamanda çalıştırılabilen kodu yüklemenize izin veren ve ardından yalnızca kodunuzun çalıştırıldığı süre için sizden ücret alan bir hizmettir. Örneğimize devam edersek, geliştiricinin kodu, iki havaalanı kodunu alan, konumlarını arayan, mesafeleri hesaplayan ve ardından kullanıcıya bir şeyler söylemek için Alexa Cloud'a bir yanıt gönderen bir Python işlevi olabilir. Alexa Cloud daha sonra bu konuşma bilgisini kullanıcının cihazına geri gönderecek ve cevabı alacaktı.

Şimdi gadget'a geri dönebiliriz. Özellikle gadget'larla çalışmak üzere tasarlanmış özel beceriler oluşturabiliriz. Bir geliştirici, bağlı bir gadget'a yönerge gönderen bir beceri yazabilir. Bu yönerge, gadget tarafından ihtiyaç duyulduğu halde kullanılabilecek bir yüke sahiptir. Bu beceri ayrıca bir yönerge gönderebilir ve ardından beceri kodunun gadget'tan gönderilen bilgilere erişebilmesi için gadget'tan bir olay dinleyebilir.

Bu akışın oluşturulması, çok güçlü bir araç oluşturulmasına olanak tanır, çünkü ucuz araçlar buluttaki kodla iletişim kurma ve mevcut en iyi ses tanıma özelliklerinden bazılarını kullanarak sesli komutlara yanıt verme yeteneğine sahip olabilir.

Çoğu becerinin, onlarla etkileşime girmenin çeşitli yollarına izin verdiğine dikkat edilmelidir. Örneğin, bir kullanıcı "Alexa, özel mesafe hesaplayıcıma LAX ile JFK arasındaki mesafenin ne olduğunu sor" diyerek doğrudan bir amaca atlayabilir (tek seferlik çağrı denir) veya yalnızca bir başlatma amacı kullanabilir: "Alexa, özel mesafe hesaplayıcımı aç". Bu son örneği tipik olarak, daha fazla bilgi için bir istemle yanıt veren Alexa izler. Bu öğretici, ikincisi için desteği kasıtlı olarak atlar. Daha spesifik olarak, Lambda işlevini değiştirmeden, yalnızca tek seferlik bir çağrı kullanarak beceriyi çağırabilirsiniz. Bu tasarım seçimi, modelin daha basit olmasını sağlar (başlatma amaçlarını veya konuşma akışını desteklemek zorunda değildir) ve genellikle daha hızlı oldukları için gadget'larımla tek seferlik çağrıları kullanarak etkileşim kurmak istediğimi buldum.

2. Adım: Gadget'ı Alexa Voice Service Developer Console'a kaydedin

Aşağıda gereken adımların açıklaması yer almaktadır. Tüm bu adımların nasıl yapıldığını gösteren eşdeğer bir video oluşturdum. Bu adımı tamamlamak için birini veya her ikisini birden kullanabilirsiniz.

  1. https://developer.amazon.com/alexa/console/avs/hom… adresine gidin.
  2. Henüz ücretsiz bir hesabınız yoksa, bir tane oluşturun
  3. "Ürünler" üzerine tıklayın
  4. Etiketleri doldurun ve "Alexa Gadget"ı seçin
  5. Kalan alanlar için istediğinizi doldurun
  6. Bitir'i tıklayın

3. Adım: AWS Lambda İşlevi ve Özel Beceri Oluşturun

Alexa Skills Kit Developer Console'da Özel Beceri Oluşturun

Bu eğitimin kodu burada bulunabilir

Bu adımı tamamlamadan önce, buradaki öğreticide gösterildiği gibi AWS Lambda işlevi için dağıtım paketini içeren bir.zip dosyası oluşturmanız gerekir.

  1. "lambda_function.py" ve "requirements.txt" içeren Github'ımdan "lambda" klasörünü indirin
  2. Terminali açın ve mevcut dizini bu klasörün içinde olacak şekilde değiştirin.
  3. Aşağıdaki sırayı çalıştırın:

pip kurulumu -r gereksinimleri.txt -t skill_env

cp lambda_function.py skill_env cd skill_env zip -r../../skill-code.zip

.zip dosyanız şimdi lambda klasörünün bulunduğu dizinde bulunacak ve "skill-code.zip" olarak adlandırılacaktır.

AWS'de barındırma maliyetine ilişkin bir not: Bu eğitici, bir AWS hesabınızın (oluşturulması ücretsiz) olmasını gerektirir. Lambda işlevlerinin maliyeti vardır, ancak K. Virginia bölgesindeki mevcut fiyatları 128 MB bellekle 100ms kullanım başına 0,000000208 ABD dolarıdır. Referans olarak, yeteneğimin her çağrısı bu katmanda yaklaşık 800 ms kullanım sağlar. 1,00 USD'lik bir faturayı rafa kaldırmak için, bu işlevi yaklaşık 600.000 kez çağırmanız gerekir; bu da (çağrı başına 5 saniye sürerse), işlevinizi kesintisiz aramanız için 34 günden fazla zamanınızı alır. Becerinizi yayınlamadığınız ve çok sayıda insan kullanmaya başlamadığınız sürece maliyet önemli bir sorun olmamalıdır. AWS'de fatura almakla ilgili endişeleriniz varsa, kullanım tanımlı bir eşiği geçtiğinde sizi bilgilendiren kullanım alarmları kurmayı düşünün.

Aşağıda gereken adımların açıklaması yer almaktadır. Tüm bu adımların nasıl yapıldığını gösteren eşdeğer bir video oluşturdum. Bu adımı tamamlamak için birini veya her ikisini birden kullanabilirsiniz.

  1. https://aws.amazon.com/ adresine gidin ve konsolda oturum açın veya hesabınız yoksa ücretsiz bir hesap oluşturun
  2. Hizmetler altında Lambda'yı arayın ve tıklayın
  3. "İşlev Oluştur" u tıklayın
  4. "Sıfırdan Yazar"ı seçin, ona bir ad verin ve çalışma zamanı için en son Python 3 sürümünü seçin
  5. "Satır içi kodu düzenle"yi ".zip dosyası yükle" olarak değiştirin ve yukarıda oluşturulan.zip dosyasını seçin
  6. Yeni bir pencerede https://developer.amazon.com/alexa/console/ask adresine gidin ve oturum açın
  7. "Beceri Oluştur" u tıklayın
  8. Etiketleyin, "Özel" modeli seçin ve "Kendinizi sağlayın" ve "Beceri Oluştur" u tıklayın.
  9. "Sıfırdan Başla" yı tıklayın ve "Seç" i tıklayın
  10. "Amaçlar" altında, "Ekle" ye tıklayın
  11. "alexa_to_pi" adında özel bir amaç oluşturun ve örnek bir ifade olarak "write {person}" yazın
  12. "AMAZON. Person" tipinde "person" adında bir niyet yuvası yapın
  13. "pi_to_alexa" adlı özel bir amaç oluşturun ve "{sensor_num} sensöründen gelen sıcaklığı kontrol edin" alanını doldurun
  14. "AMAZON. NUMBER" türüyle "sensor_num" adlı bir amaç yuvası yapın
  15. Arayüzler altında, "Özel Arayüz Denetleyicisi"ni açın
  16. Endpoint altında, "AWS Lambda ARN"yi seçin ve "Skill ID'nizi" kopyalayın.
  17. AWS Konsoluna geri dönün
  18. "Tetikleyici Ekle" ye tıklayın
  19. "Alexa Skills Kit"i seçin, Skill ID doğrulaması altında "Etkinleştir"i işaretleyin, az önce kopyaladığınız Skill ID'yi yapıştırın ve ekle'ye tıklayın.
  20. Sağ üst köşedeki Lambda ARN'yi kopyalayın
  21. Alexa Developer Console'a Geri Dönün ve Lambda ARN'yi "Varsayılan Bölge" alanına yapıştırın
  22. Çağrı altında, Beceri Çağrı Adını "gadget'ım" olarak ayarlayın
  23. "Modeli Kaydet" i ve ardından "Model Oluştur" u tıklayın
  24. Üst sekmelerde "Test"e tıklayın ve seçiciyi "Kapalı"dan "Geliştirme"ye değiştirin
  25. Lambda işlevine ilişkin günlüklerin AWS'deki "CloudWatch" hizmetinde bulunduğunu unutmayın.

Adım 4: Raspberry Pi'nizde Kodu Ayarlayın

Raspberry Pi'nizin Alexa cihazıyla iletişim kurması için, birkaç dosyaya ek olarak, bluetooth üzerinden bilgi geçişini ve bu bağlantıyı sürdürmeyi kolaylaştırmak için bazı kodlara ihtiyacı vardır. Amazon'daki en güncel dosyaları kullanmaya başlamanın en kolay yolu, Raspberry Pi Gadgets deposunu klonlamaktır. Mevcut projenizin dizinine gidin ve çalıştırın

git klon

Bu, tüm depolarını gerekli tüm kodlarla Pi'nize yükleyecektir. Alexa Gadget'larının bazı yeteneklerini gösteren bazı örnek projeler var. Daha fazla bilgi isterseniz, Github sayfasındaki benioku dosyasına bakın.

Her şeyi yapılandırmak için kurulum işlevlerini çalıştırın.

cd /home/pi/Alexa-Gadgets-Raspberry-Pi-Örnekler

sudo python3 launch.py --setup

İstemleri izleyin ve Gadget kimlik bilgilerinizi kullanarak yapılandırmak isteyip istemediğiniz sorulduğunda "y" yanıtını verin. Burada isteneceğinden, gadget'ınızı geliştirici konsolunda kurarken Amazon Kimliği ve Gadget Sırrı'nı hatırlayın. Raspberry Pi Zero W'm için "bt" iletim modunu seçtim. BLE, tüm eski Echo cihazları tarafından desteklenmiyor, ancak donanımınızın neler yapabileceğine bakabilirsiniz. Pi'nizi Masaüstü modunda kullanıyorsanız Amazon, bağlantı sorunlarını önlemek için sağ üstteki bluetooth simgesine sağ tıklayıp "Panelden "Bluetooth"u Kaldır" seçeneğine tıklamanızı önerir.

Not: Bu adım, ne kadar yüklenmesi gerektiğine bağlı olarak biraz zaman alabilir.

Artık projenize geri dönmek ve Echo'nuzla iletişime izin verecek işlevleri eklemeye başlamak için gerekli tüm destek dosyalarına sahip olacaksınız.

Seçerseniz, "Alexa-Gadgets-Raspberry-Pi-Samples/src" içindeki "examples" klasörünü silebilirsiniz.

Proje kodunuzu istediğiniz yerde alabilirsiniz, ancak bunun için ana dizinde bir klasör yapacağım, alternatif olarak kodun bulunduğu klasörü Github'ımdan indirebilirsiniz, sadece.ini dosyalarını aşağıda açıklandığı gibi düzenlediğinizden emin olun.

cd /ev/pi

mkdir my_project cd my_project my_gadget.py'ye dokunun my_gadget.ini'ye dokunun

Şimdi "my_project" adlı bir klasörde iki dosya oluşturdum..ini dosyası önemlidir. Amazon Kimliğinizde ve Gadget Sırrınızda aşağıdakileri ve yerine geçenleri içerdiğinden emin olun:

[GadgetAyarları]

amazonId = INSERT_AMAZON_ID_HERE alexaGadgetSecret = INSERT_ALEXA_GADGET_SECRET_HERE [GadgetCapabilities] Custom. MyGadget = 1.0

Şimdi ayrıntılara girmeden önce python dosyasına bir göz atalım:

json'u içe aktar

agt'dan AlexaGadget'ı içe aktar

sınıf MyGadget(AlexaGadget):

tanım _init_(kendi):

süper()._init_()

def on_custom_mygadget_alexatopi(self, yönerge):

payload = json.loads(directive.payload.decode("utf-8")) print("Alınan veri: " + str(payload)) write_text(str(payload['data']['person']['value) ']))

def on_custom_mygadget_pitoalexa(self, yönerge):

payload = json.loads(directive.payload.decode("utf-8")) print("Alınan veri: " + str(payload)) payload = {'data': "Sonda okur " + str(get_temp(payload) ['veri'] ['sensor_num']['değer'])) + " derece."} self.send_custom_event('Custom. MyGadget', 'PiToAlexa', yük) MyGadget().main()

İlk önce iki işlevi çağırdığını fark edeceksiniz: write_text() ve get_temp(). Kodumda bu işlevleri aynı dosyada tanımlıyorum, ancak bunlar benim donanımıma bağlı, bu yüzden onları çıkarmayı seçtim. Bu dosyayı, tam olarak bu kodu çalıştırmak istemeniz durumunda yalnızca sahte verileri yazdırmak ve döndürmek için tanımlanan işlevlerle ekledim. Projenizle çalışacak şekilde değiştirmeden önce bu tam kodla test etmenizi öneririm..ini dosyasını da ekledim, ancak içeri girip kimliği ve gadget sırrını değiştirdiğinizden emin olun. Üst işlev, Alexa'dan iletilen verileri alır. Alttaki işlev, verileri aynı biçimde alır, ancak Alexa cihazı, bir olayın kendi yüküyle geri döndürülmesi için beş saniye bekleyecektir. Bu yük, Alexa cihazının içeriğini konuşacağı için özeldir.

Bu dosyalara sahip olduğunuzda, "my_project" klasörüne gidin ve python dosyasını çalıştırın.

sudo yeniden başlatma

cd /home/pi/my_project sudo python3./my_gadget.py

Programı ilk kez çalıştırıyorsanız, programı Echo cihazınızla eşleştirmeniz gerekecektir. Bluetooth bağlantısına izin vermemiz gerektiğinden, Echo cihazınızın Raspberry Pi'nin yakınında olduğundan emin olun.

Mobil cihazınızdaki Alexa uygulamasında sağ alt köşedeki "cihazlar"a tıklayın.

Sol üstteki "Yankı ve Alexa" yı tıklayın.

Echo cihazınıza tıklayın.

"KABLOSUZ" altında, "Bluetooth Cihazları"na dokunun.

"YENİ BİR CİHAZ EŞLEŞTİR"e dokunun ve gadget'ınızı listede görmelisiniz.

Gadget'ınıza dokunun. Başarılı bir şekilde eşleştiğine dair Pi raporunu görmelisiniz.

Pi'nizdeki çıktıyı izlerken Echo'ya sesli komut vermeyi deneyin:

Siz: "Alexa, aygıtımdan birinci sensörden sıcaklığı kontrol etmesini isteyin"

Her şey düzgün çalıştıysa, şunları duymalısınız:

Echo: "Sonda 120.505 derece okuyor."

Siz: "Alexa, aygıtıma George Washington yazmasını söyle."

Pi yazdırmalıdır:

Alınan veriler: {'data': {'person': {'name': 'person', 'value': 'George Washington', 'confirmationStatus': 'NONE'}}}

George Washington"

Adım 5: Toplama

Burada gösterilen video, sıcaklığı okuma (F'ye karşı C'de aynı prob) ve basit bir ekrana ad yazma ile çalışan cihazın bir örneğidir.

Artık, umarım çalışan bir şeyiniz olduğuna göre, kendi projenizi daha yetenekli hale getirmek için bunu özelleştirmeye çalışmalısınız. Alexa Developer Console'da niyetleri kolayca düzenleyebileceğinizi ve kullandığınız tüm slotların payload'da Pi'nize geçeceğini unutmayın. Ayrıca, olayda geri ilettiğiniz yükü Raspberry Pi kodunuzdan düzenleyerek Alexa'nın istediğiniz her şeyi söylemesini sağlayabilirsiniz.

Lütfen bu öğreticinin, bir Alexa Gadget'ı ile isteyebileceğiniz tüm yetenekler için nihai bir çözüm olarak tasarlanmadığını unutmayın. Alexa ve bir Gadget arasında her yönde veri iletmek için size iki basit işlev vermek kasıtlı olarak sınırlıdır. Daha karmaşık etkileşim modelleri oluşturmakla ilgileniyorsanız, https://github.com/alexa/Alexa-Gadgets-Raspberry-P… adresindeki tüm benioku dosyalarını okumanızı ve sağladıkları tüm örnekleri denemenizi tavsiye ederim.. Ayrıca Alexa Gadgets Toolkit ve Alexa Skills Kit belgelerini okumanızı öneririm.

Önerilen: