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.

ESP8266 NodeMCU ile Homekit Entegrasyonu esp8266 nodemcu ile homekit,apple homekit nodemcu,esp8266 apple homekit

Ö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
ESP8266 NodeMCU ile Homekit Entegrasyonu esp8266 nodemcu ile homekit,apple homekit nodemcu,esp8266 apple homekit

Kodun Yüklenmesi

Eğer görseldeki gibi bir model yani NodeMCU 1.0 kullanıyorsanız, seçimlerinizi bu şekilde yapabilirsiniz:

ESP8266 NodeMCU ile Homekit Entegrasyonu esp8266 nodemcu ile homekit,apple homekit nodemcu,esp8266 apple homekit

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.

ESP8266 NodeMCU ile Homekit Entegrasyonu esp8266 nodemcu ile homekit,apple homekit nodemcu,esp8266 apple homekit

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.