Arama butonu
Bu konudaki kullanıcılar: 1 misafir
2
Cevap
526
Tıklama
1
Öne Çıkarma
Nodemcu-Esp8266 ile kendi apple homekitini yapma
S
2 yıl
Teğmen
Konu Sahibi

Merhaba arkadaşlar internette yabancı kaynaklarda bilgiler var ama biraz daha türkçe kaynak olsun diye kendi yaptığım sistemi anlatıcam.

Ben televizyonumun arkasına ve tv standımı aydınlaran iki led şeridi apple homekit ile siri kullanarak açıp kapatmak istedim. bunlar için hue gibi yada diğer hazır cihazlara tonlarca para dökmek yerine basit sistemler ile kendim yapmak istedim..

Ben bir nodemcu esp8266 ve 5v role ve bir adaptör (12v led adaptörü)

Bağlantımı şu şekilde yaptım.
nodemcu pinlerinden
d4 ve d0 ı roledeki in1 ve in2 ye
roledeki vcc bağlantısı-nodemcu vcc
roledeki gnd bağlantısını-nodemcu gnd pinine bağladım

apple home kit uyumlu olması için bu kütüphaneyi nodemcuyu arduinoya ideye bağlayarak kullandım

Kodlar;

Aydınlatma.ino;

#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(); // WiFi bağlantısını başlat
      // homekit_storage_reset(); // yeni bir projede burayı aç ios tanımlamayı yap geri bu hale getir
  my_homekit_setup();
}

void loop() {
  my_homekit_loop();
  checkConnection(); // Bağlantı durumunu kontrol et
  delay(10);
}
//==============================
// HomeKit setup and loop
//==============================

// access your HomeKit characteristics defined in my_accessory.c
extern "C" homekit_server_config_t config;
extern "C" homekit_characteristic_t cha_switch_on;
extern "C" homekit_characteristic_t cha_switch_on2;
extern "C" homekit_characteristic_t cha_switch_on3;
extern "C" homekit_characteristic_t cha_switch_on4;

static uint32_t next_heap_millis = 0;

#define PIN_SWITCH 2
#define PIN_SWITCH2 5
#define PIN_SWITCH3 0
#define PIN_SWITCH4 4


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 cha_switch_on_setter2(const homekit_value_t value) {
  bool on = value.bool_value;
  cha_switch_on2.value.bool_value = on;  //sync the value
  LOG_D("Switch: %s", on ? "ON" : "OFF");
  digitalWrite(PIN_SWITCH2, on ? LOW : HIGH);
}
void cha_switch_on_setter3(const homekit_value_t value) {
  bool on = value.bool_value;
  cha_switch_on3.value.bool_value = on;  //sync the value
  LOG_D("Switch: %s", on ? "ON" : "OFF");
  digitalWrite(PIN_SWITCH3, on ? LOW : HIGH);
}
void cha_switch_on_setter4(const homekit_value_t value) {
  bool on = value.bool_value;
  cha_switch_on4.value.bool_value = on;  //sync the value
  LOG_D("Switch: %s", on ? "ON" : "OFF");
  digitalWrite(PIN_SWITCH4, on ? LOW : HIGH);
}

void my_homekit_setup() {
    pinMode(PIN_SWITCH, OUTPUT);
    digitalWrite(PIN_SWITCH, HIGH);
  pinMode(PIN_SWITCH2, OUTPUT);
  digitalWrite(PIN_SWITCH2, HIGH);
  pinMode(PIN_SWITCH3, OUTPUT);
  digitalWrite(PIN_SWITCH3, HIGH);
  pinMode(PIN_SWITCH4, OUTPUT);
  digitalWrite(PIN_SWITCH4, 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;
  cha_switch_on2.setter = cha_switch_on_setter2;
   cha_switch_on3.setter = cha_switch_on_setter3;
    cha_switch_on4.setter = cha_switch_on_setter4;
    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());

    }
}




my_accessory.h kodlarım ;


#include <homekit/homekit.h>
#include <homekit/characteristics.h>

void my_accessory_identify(homekit_value_t _value) {
    printf("accessory identify\n");
}


homekit_characteristic_t cha_switch_on = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t cha_switch_on2 = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t cha_switch_on3 = HOMEKIT_CHARACTERISTIC_(ON, false);
homekit_characteristic_t cha_switch_on4 = HOMEKIT_CHARACTERISTIC_(ON, false);

// format: string; HAP section 9.62; max length 64
homekit_characteristic_t cha_name = HOMEKIT_CHARACTERISTIC_(NAME, "tv");

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, "tv"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "tv HomeKit"),
            HOMEKIT_CHARACTERISTIC(SERIAL_NUMBER, "3458421"),
            HOMEKIT_CHARACTERISTIC(MODEL, "ESP8266"),
            HOMEKIT_CHARACTERISTIC(FIRMWARE_REVISION, "3.0"),
            HOMEKIT_CHARACTERISTIC(IDENTIFY, my_accessory_identify),
            NULL
        }),
        HOMEKIT_SERVICE(SWITCH, .primary=true, .characteristics=(homekit_characteristic_t*[]){
            &cha_switch_on,
            &cha_name,
            NULL
        }),
        NULL
    }),
        HOMEKIT_ACCESSORY(.id=2, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) {
        HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) {
            HOMEKIT_CHARACTERISTIC(NAME, "Switch2"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino 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_on2,
      &cha_name,
      NULL
    }),
        NULL
    }),
    HOMEKIT_ACCESSORY(.id=3, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) {
        HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) {
            HOMEKIT_CHARACTERISTIC(NAME, "Switch3"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino 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_on3,
      &cha_name,
      NULL
    }),
        NULL
    }),
    HOMEKIT_ACCESSORY(.id=4, .category=homekit_accessory_category_switch, .services=(homekit_service_t*[]) {
        HOMEKIT_SERVICE(ACCESSORY_INFORMATION, .characteristics=(homekit_characteristic_t*[]) {
            HOMEKIT_CHARACTERISTIC(NAME, "Switch4"),
            HOMEKIT_CHARACTERISTIC(MANUFACTURER, "Arduino 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_on4,
      &cha_name,
      NULL
    }),
        NULL
    }),
    NULL
};

homekit_server_config_t config = {
        .accessories = accessories,
        .password = "123-44-567"
};



wifi_info.h kodlarım ;
/*
 * wifi_info.h
 *
 * Oluşturulma tarihi: 2023-12-02
 * Yazar: Skyhan
 */

#ifndef WIFI_INFO_H_
#define WIFI_INFO_H_

#if defined(ESP8266)
#include <ESP8266WiFi.h> // ESP8266 için WiFi kütüphanesi
#elif defined(ESP32)
#include <WiFi.h>
#endif

const char *ssid = "wifi adı";
const char *password = "wifi şifren";

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());
}

void sendHeartbeat() {
  // TODO: HomeKit'e bir 'kalp atışı' gönderme işlemi buraya eklenecek
}

void checkConnection() {
  if (WiFi.status() != WL_CONNECTED) {
    Serial.println("WiFi bağlantısı kesildi! Yeniden bağlanılıyor...");
    wifi_connect(); // Bağlantıyı yeniden kur
  }
}

#endif




my_accessory kısmında bulunan bu yerde kendi apple home şifresini belirleyebilirsiniz.

homekit_accessory_t *accessories[] = ...
homekit_server_config_t config = {
.accessories = accessories,
.password = "111-11-111",
//.on_event = on_homekit_event, //optional
//.setupId = "ABCD" //optional
};


wifi_info.h da wifi bilgilerinizi güncelleyin.

const char *ssid = "wifi adı";
const char *password = "wifi şifren";


gerisi adaptorden gelen kablonun + ucu ve - ucu belirleyip role bağlantısını yapın ve kodlarınızı arduino ide ile nodemcuya yükleyin.


burda 5v role esp şeklinde googleda arayarak daha kğçğk minimal çözümler bulabilirsiniz illa nodemcu kullanmak gerekmiyor.

nodemcu role kullanımını bakınız.

burdaki sistemde bir getway veya hub lazım değil wifiye bağlayıp kullanabilirsiniz .

Proje kodları ve şifreyi değiştirip yeni bir proje yaptınızda apple home aksesuar eklemede görmekte sorun yaşarsanız. aydınlatma.inoda verdiğim ;

void setup() {
  Serial.begin(115200);
  wifi_connect(); // WiFi bağlantısını başlat
      // homekit_storage_reset(); // yeni bir projede burayı aç ios tanımlamayı yap geri bu hale getir
  my_homekit_setup();
}


homekit_storage_reset();
kısmını aktif edin tekrar yükleyin kodları görür.

Eğer ben böyle bişi yapıp satış yapmak istiyorum ama wifi bilgisini satın alan güncelleyemez benzeri muhabbetleriniz varsada nodemcu esp8266 wifimanager kütüphanesi kullanarak kodlarınıza eklerseniz. cihazı hazır hale getirdiğinizde esp8266 wifi ile bağlanıp güncel wifi ağının bilgilerini giren bir sistem yapmak zor değil. biraz araştırabilirsiniz ben gerek duymadım.

not: esp8266 genelde 2.4ghz wifi ağı kullanır. 5ghz ağda çalışmaz.
ek: ben kodlarda 4 roleli sistem için kodladım. paylaştığım kütüphanede swich, hareket sensörü vb örnek kodlarda var.

bundan sonrası sizin kullanmak istediğiniz sisteme bağlı hareket sensörü örneği yapıp bildirim alabilirsiniz bu sistem ben ev içi yaptım internetten kontrol için homeasistan tarzı uygulamalara bu projenizi ekleyebilirsiniz

yada nodemcu ile telegrama whatsapa mesaj atma kodları dahil edebilir odanıza biri girdiğinde mesaj alabilirsiniz.

gerisi sizin hayalgücünüze ve kod bilginize kalmış.





< Bu mesaj bu kişi tarafından değiştirildi Sky Han -- 19 Aralık 2023; 22:25:14 >

Y
geçen yıl
Er

hocam bu kodlarla denedim, yabancı forumlardaki kodlarla da denedim bir türlü kodu yükleyip çalıştıramadım. Ya kodda hata oluyor. Onu çözünce de yüklerken hata veriyor.



< Bu ileti mobil sürüm kullanılarak atıldı >

A
6 ay
Binbaşı

Merhaba.


https://haus-automatisierung.com/hardware/2024/07/17/homekey-esp32-apple-home.html

şu sitedeki gibi bir sistem kurmak için esp8266 ve pn532 aparatlar aldım.
herşeyi yaptım fakat sistemi tam olarak kullanamıyorum.
sizin bu sistem ile aynı mantıkta çalışıyor bence



DH Mobil uygulaması ile devam edin. Mobil tarayıcınız ile mümkün olanların yanı sıra, birçok yeni ve faydalı özelliğe erişin. Gizle ve güncelleme çıkana kadar tekrar gösterme.