ESP8266 NodeMCU ile Homekit Entegrasyonu
ESP8266 NodeMCU ile Homekit entegrasyonu, IOT yani Internet of Things(Nesnelerin interneti) kavramını günlük hayatımıza kolay bir şekilde taşıyabileceğimiz düşük bütçeli bir sistemdir. Yaygın olarak satıların IoT kontrol cihazları oldukça pahalı ve kimi modellerde sadece Anroid cihazlara uyumlu olarak gelmektedir.
GitHub üzerinde “Mixiaoxiao” isimli kullanıcının yayınlandığı Arduino-HomeKit-ESP8266 kütüphanesi ile NodeMCU ya da wi-fi desteği olan geliştirme kartlarınıza Apple Homekit entegrasyonunu kolay bir şekilde yapabilirsiniz. Yayınlanan farklı kütüphaneler ekstra olarak homebridge kullanımı gerektirmektedir, fakat bu kütüphane homebridge olmadan da kullanılabilmektedir. Homebridge olmadağı için, bu projede yaptığımız IoT cihazı sadece yerel ağınızda çalışabilecektir.
Açık kaynalıklı bir kütüphane olduğu için kütüphane ile beraber gelen örnekleri isteğinize göre değiştirebilirsiniz. Biz örnek olarak “Switch” kodunu kullanacağız. Fakat örnekler arasında size en uygun olanı seçebilirsiniz.
Ayrıca, NodeMCU(ESP8266) geliştirme kartına program yüklemek Arduino IDE’yı kullancağız, daha önceki yazılarımızda Arduino IDE’ye ESP mikro denetleyicilerinin desteğini kurmuştur. Eğer IDE’nizde bu destek yoksa bu bağlantıyı izleyerek gerekli desteği kurabilirsiniz.
Proje Kodu
Yukarıda bahsettiğimiz GitHub kütüphanesini .zip olarak indirip, Arduino IDE’nizin kütüphane kısmında kurmanız gerekiyor. Kütüphane kurma konusuna hakim değilseniz bu yazımıza göz atabilirsiniz.
Örnek olarak “Switch” seçtiğiniz zaman varsayılan olarak 3 farklı düzenlenebilir dosya önünüze gelecektir:
Example02_Switch
Burada değiştirmek isteyebileceğiniz kısımlar, pin ataması ya da başlangıçta açık/kapalı olma durumları olabilir.
#include <Arduino.h> #include <arduino_homekit_server.h> #include "wifi_info.h" #define LOG_D(fmt, ...) printf_P(PSTR(fmt "\n") , ##__VA_ARGS__); void setup() { Serial.begin(115200); wifi_connect(); // in wifi_info.h //homekit_storage_reset(); // to remove the previous HomeKit pairing storage when you first run this new HomeKit example my_homekit_setup(); } void loop() { my_homekit_loop(); delay(10); } // access your HomeKit characteristics defined in my_accessory.c extern "C" homekit_server_config_t config; extern "C" homekit_characteristic_t cha_switch_on; static uint32_t next_heap_millis = 0; #define PIN_SWITCH 2 //Called when the switch value is changed by iOS Home APP void cha_switch_on_setter(const homekit_value_t value) { bool on = value.bool_value; cha_switch_on.value.bool_value = on; //sync the value LOG_D("Switch: %s", on ? "ON" : "OFF"); digitalWrite(PIN_SWITCH, on ? LOW : HIGH); } void my_homekit_setup() { pinMode(PIN_SWITCH, OUTPUT); digitalWrite(PIN_SWITCH, HIGH); //Add the .setter function to get the switch-event sent from iOS Home APP. //The .setter should be added before arduino_homekit_setup. //HomeKit sever uses the .setter_ex internally, see homekit_accessories_init function. //Maybe this is a legacy design issue in the original esp-homekit library, //and I have no reason to modify this "feature". cha_switch_on.setter = cha_switch_on_setter; arduino_homekit_setup(&config); //report the switch value to HomeKit if it is changed (e.g. by a physical button) //bool switch_is_on = true/false; //cha_switch_on.value.bool_value = switch_is_on; //homekit_characteristic_notify(&cha_switch_on, cha_switch_on.value); } void my_homekit_loop() { arduino_homekit_loop(); const uint32_t t = millis(); if (t > next_heap_millis) { // show heap info every 5 seconds next_heap_millis = t + 5 * 1000; LOG_D("Free heap: %d, HomeKit clients: %d", ESP.getFreeHeap(), arduino_homekit_connected_clients_count()); } }
wifi_info.h
Bu dosyada evinize ait Wi-fi router’ın ismi ve şifre bilgilerini girmeniz gerekiyor:
const char *ssid = "wifi ismi";
const char *password = "wifi sifresi";
#ifndef WIFI_INFO_H_ #define WIFI_INFO_H_ #if defined(ESP8266) #include <ESP8266WiFi.h> #elif defined(ESP32) #include <WiFi.h> #endif const char *ssid = "wifi ismi"; const char *password = "wifi sifresi"; void wifi_connect() { WiFi.persistent(false); WiFi.mode(WIFI_STA); WiFi.setAutoReconnect(true); WiFi.begin(ssid, password); Serial.println("WiFi connecting..."); while (!WiFi.isConnected()) { delay(100); Serial.print("."); } Serial.print("\n"); Serial.printf("WiFi connected, IP: %s\n", WiFi.localIP().toString().c_str()); } #endif /* WIFI_INFO_H_ */
my_accesory.c
Bu kısım aslında Homekit ile iletişimi sağlayan kısımdır, aksesuarınızız şifresi varsayılan olarak “111-11-111” gelmektedir ve Homekit üzerinde kurulum yaparken bu şifreyi sizden girmenizi isteyecektir. Ayrıca Homekit üzerinden bağlantı kurarken bu aksesuarın imzalı olmadığını yani resmi bir aksesuar olmadığı uyarısını alırsınız.
.password = "111-11-111"
#include <homekit/homekit.h> #include <homekit/characteristics.h> void my_accessory_identify(homekit_value_t _value) { printf("accessory identify\n"); } // format: bool; HAP section 9.70; write the .setter function to get the switch-event sent from iOS Home APP. homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, false); // format: string; HAP section 9.62; max length 64 homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "Switch"); homekit_accessory_t *accessories[] = { HOMEKIT_ACCESSORY(.id=1, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) { HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) { HOMEKIT_CHARACTERISTIC(NAME, "Switch"), HOMEKIT_CHARACTERISTIC(MANUFACTURER, "NodeMCU HomeKit"), HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "0123456"), HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266/ESP32"), HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "1.0"), HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify), NULL }), HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){ &cha_switch_on, &cha_name, NULL }), NULL }), NULL }; homekit_server_config_t config = { .accessories = accessories, .password = "111-11-111" };
Devre Şeması
Example02_Switch dosyasında atanan pine göre 2 yani D4 pinine bağlı her hangi bir modülü örneğin röle, LED, tetikleyici gibi modüllere Homekit uygulaması üzerinden kontrol edebilirsiniz.
#define PIN_SWITCH 2
Kodun Yüklenmesi
Eğer görseldeki gibi bir model yani NodeMCU 1.0 kullanıyorsanız, seçimlerinizi bu şekilde yapabilirsiniz:
Doğru seçimleri ve port seçimini yaptıksan sonra doğrudan “Yükle/Upload” butonuna basın, yükleme yüzdeler eşliğinde devam edecektir. Yükleme tamamlandıktan sonra kart üzerinde bulunan RST butonu ile geliştirme kartını resetleyin.
Kurulum tamamlandıktan sonra Wi-fi ağınıza otomatik olarak bağlanacaktır, devamında Homekit uygulamasına girerek kurulumu 111-11-111 şifresi ile tamamlayabilirsiniz.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.