Fauxmo ile Alexa/Google Home Sesli Kontrol Entegrasyonu
Proje Amacı
ESP32'yi, Amazon Alexa veya Google Home'un zaten tanıdığı bir Philips Hue/Belkin Wemo akıllı priz gibi taklit ederek (fauxmoESP kütüphanesiyle UPnP/SSDP protokolü üzerinden), herhangi bir bulut hesabı veya geliştirici kaydı olmadan 'Alexa, lambayı aç' gibi sesli komutlarla röle kontrolü yapmayı öğretir. ESP32'nin WiFi ağ yığını, UDP multicast (SSDP keşif) ve yerel bir HTTP sunucusunu aynı anda çalıştırabilecek yeterli RAM ve ağ desteğine sahiptir. Bu senaryo Arduino Uno'da kurulamaz: WiFi donanımı olmadığından ne UDP multicast dinleyebilir ne de Alexa'nın yerel ağ taramasına yanıt verebilecek bir HTTP sunucusu çalıştırabilir.
Gerekli Malzemeler
- ESP32 DevKit V1 (38 pin)
- 2x Röle modülü (5V, optokuplörlü)
- Breadboard
- Jumper kablolar
- Harici 5V güç kaynağı (röle bobinleri için önerilir)
- Amazon Alexa veya Google Home cihazı/uygulaması
Gerekli Kütüphaneler
fauxmoESP by vintlabs/kakopappa (Library Manager'dan kurun, sürüm >= 3.4 — ESP32 core 2.x ile bazı eski sürümlerde derleme uyarıları görülebilir, güncel tutun).
Pin Bağlantıları
| Bileşen Pini | Bağlantı |
|---|---|
| Röle-1 (Lamba) IN | GPIO4 |
| Röle-2 (Fan) IN | GPIO16 |
| Röle VCC | 5V (VIN, harici kaynak önerilir) |
| Röle GND | GND |
Devre Şeması
ESP32 Kodu
| 1 | #include <WiFi.h> |
| 2 | #include <fauxmoESP.h> |
| 3 | |
| 4 | const char* ssid = "WIFI_ADINIZ"; |
| 5 | const char* password = "WIFI_SIFRENIZ"; |
| 6 | const int ROLE_LAMBA = 4, ROLE_FAN = 16; |
| 7 | |
| 8 | fauxmoESP fauxmo; |
| 9 | |
| 10 | void setup() { |
| 11 | Serial.begin(115200); |
| 12 | pinMode(ROLE_LAMBA, OUTPUT); |
| 13 | pinMode(ROLE_FAN, OUTPUT); |
| 14 | |
| 15 | WiFi.mode(WIFI_STA); |
| 16 | WiFi.begin(ssid, password); |
| 17 | while (WiFi.status() != WL_CONNECTED) { delay(400); Serial.print("."); } |
| 18 | Serial.println("\nBağlandı: " + WiFi.localIP().toString()); |
| 19 | |
| 20 | fauxmo.createServer(true); |
| 21 | fauxmo.setPort(80); // ESP32'de 80 kullanılabilir (ESP8266'da genelde 81 önerilir) |
| 22 | fauxmo.enable(true); |
| 23 | |
| 24 | // Alexa/Google Home'un "cihaz taraması"nda göreceği isimler — SESLE |
| 25 | // SÖYLEYECEĞİNİZ isimlerle BİREBİR aynı olmalı. |
| 26 | fauxmo.addDevice("lamba"); |
| 27 | fauxmo.addDevice("fan"); |
| 28 | |
| 29 | fauxmo.onSetState([](unsigned char cihazId, const char* cihazAdi, bool durum, unsigned char parlaklik) { |
| 30 | Serial.printf("[%s] durum: %s\n", cihazAdi, durum ? "ACIK" : "KAPALI"); |
| 31 | if (strcmp(cihazAdi, "lamba") == 0) digitalWrite(ROLE_LAMBA, durum ? HIGH : LOW); |
| 32 | else if (strcmp(cihazAdi, "fan") == 0) digitalWrite(ROLE_FAN, durum ? HIGH : LOW); |
| 33 | }); |
| 34 | |
| 35 | Serial.println("Fauxmo hazır. Alexa/Google Home uygulamasından 'cihaz keşfet'i çalıştırın."); |
| 36 | } |
| 37 | |
| 38 | void loop() { |
| 39 | fauxmo.handle(); // SSDP keşif isteklerine ve komutlara yanıt verir, sık çağrılmalı |
| 40 | } |
Çalışma Açıklaması
fauxmo.setPort(80) ESP32'de sorunsuz çalışır ama bu portta aynı anda başka bir web sunucusu (proje #06/#11'deki gibi) çalıştırıyorsanız çakışma yaşanır — aynı projede ikisini birlikte kullanmak isterseniz farklı bir port (81) deneyin, ancak bazı Alexa cihazları standart olmayan portu görmeyebilir. Cihaz isimleri (fauxmo.addDevice içindeki) sesle söyleyeceğiniz isimle birebir eşleşmelidir; 'lamba' yerine 'oturma odası lambası' gibi çok kelimeli isimler bazen tanınma sorunları yaşatabilir.
Test Bilgisi
Kodu yükleyin. Alexa uygulamasında 'Cihazlar > + Ekle > Cihaz Keşfet' (veya Google Home'da 'Cihaz Ekle > Eşleştirilmiş Olmayan Cihazlar') seçeneğini çalıştırın; 'lamba' ve 'fan' isimli iki yeni cihaz otomatik görünmeli. 'Alexa, lambayı aç' diyerek röle-1'in tetiklendiğini duyarak ve görerek doğrulayın, ardından 'Alexa, fanı kapat' diyerek ikinci cihazın da bağımsız çalıştığını kontrol edin.
Olası Sorunlar ve Çözümleri
Alexa cihaz keşfinde hiçbir şey bulamıyorsa: ESP32 ve Alexa/Echo cihazının aynı WiFi ağında (misafir ağında değil) olduğundan emin olun, çoğu router'da misafir ağları cihaz izolasyonu uygular. Cihaz bulunuyor ama komut çalışmıyorsa: fauxmo.handle() çağrısının loop() içinde delay() gibi bloklayıcı kod olmadan sık çağrıldığından emin olun. Röle 'ters' çalışıyorsa (aç dendiğinde kapanıyor): kullandığınız röle modülünün 'active LOW' olup olmadığını kontrol edin, gerekirse digitalWrite mantığını (HIGH/LOW) ters çevirin.
Alternatif Çözümler
Sadece aç/kapa yerine fauxmo.addDevice ile bir 'dimmer' (parlaklık ayarlı) cihaz tanımlanıp parlaklik parametresi kullanılarak PWM ile ışık kısılabilir. Fauxmo yerine resmi bir Alexa Skill veya Google Actions geliştirilerek bulut tabanlı, daha güvenilir ama kurulumu daha karmaşık bir entegrasyon yapılabilir. Sesli komutlara ek olarak proje #11'deki mDNS ile yerel ağdan da (Alexa olmadan) tarayıcıyla kontrol imkânı eklenebilir.
Benzer Projeler
ESPAsyncWebServer ile Bloklamayan Çoklu İstemci REST API
Birden fazla tarayıcı veya istemcinin aynı anda, birbirini bloklamadan bağlanıp iki rölenin durumunu okuyup değiştirebildiği asenkron (event-driven) bir REST API sunmayı öğretir — akıllı ev panelleri ve endüstriyel kontrol arayüzlerinde tercih edilen mimarinin küçük ölçekli bir örneğidir. ESPAsyncWebServer, gelen her isteği ayrı ayrı bekletmeden (non-blocking) LwIP ağ yığınıyla doğrudan çalışır; bunun için ESP32'nin ikinci çekirdeği ve yeterli RAM'i (520KB SRAM) devreye girer. Bu mimari Arduino Uno'da kurulamaz: WiFi donanımı yoktur; harici bir WiFi shield eklense bile klasik senkron 'WiFiServer' modeli her isteği sırayla işler ve 2KB RAM, birden fazla eşzamanlı bağlantı arabelleğini aynı anda tutmaya yetmez.
OTA Kablosuz Firmware Güncelleme Sistemi
ESP32'nin dahili çift OTA (Over-The-Air) flash partisyon şemasını kullanarak, sahaya kurulmuş bir cihaza tekrar USB kablosu takmadan tamamen kablosuz şekilde yeni firmware yüklemeyi öğretir — özellikle tavana, duvara veya erişimi zor bir noktaya monte edilmiş onlarca cihazı yönetirken zaman ve emek kazandıran pratik bir yetenektir. ESP32'nin flash belleği kalkınma sırasında bir 'factory' bölümü ile iki ayrı OTA partisyonuna bölünebilir; cihaz yeni kodu ağdan indirip o an boş olan partisyona yazar, bütünlük kontrolünden geçerse oradan açılış yapar ve önceki çalışan sürüm otomatik olarak yedek konumunda kalır, böylece yarım kalan veya bozuk bir güncelleme cihazı kullanılamaz hale getirmez. Bu iki katmanlı flash mimarisi ESP32'ye özgüdür: Arduino Uno'nun ATmega328P'sinde toplam flash belleği zaten 32KB'dir ve sketch kodunun kendisi bu alanın büyük bölümünü kapladığından ikinci bir tam firmware kopyasına yer kalmaz; kartta WiFi donanımı da bulunmadığından ağ üzerinden güncelleme almak zaten söz konusu değildir.
TLS/SSL ile Şifreli MQTT Veri Yayını
Sıcaklık/nem verisini, sertifika tabanlı TLS/SSL şifrelemesiyle (WiFiClientSecure) bir MQTT broker'a güvenli şekilde yayınlamayı öğretir — düz metin (plaintext) MQTT'nin aksine veri yolda kimse tarafından okunamaz veya değiştirilemez. ESP32'nin donanımsal AES/SHA kripto hızlandırıcısı, TLS el sıkışmasını (handshake) makul bir sürede tamamlayacak işlem gücünü sağlar; 520KB SRAM'i ise TLS oturum arabelleklerini, sertifika zincirini ve şifreleme durumunu aynı anda bellekte tutabilir. Bu kapasite Arduino Uno'da bulunmaz: kartın sadece 2KB SRAM'i vardır ve tek bir TLS sertifikası bile bu belleğe sığmaz; kripto hızlandırma donanımı ve WiFi radyosu da zaten mevcut değildir, dolayısıyla şifreli bir ağ bağlantısı kurmanın önünde temel bir donanım sınırı vardır.