ESP8266, MQTT ve Home Assistant ile Ev İçi Sıcaklık–Nem İzleme Sistemi Kurulumu

Evimin farklı odalarındaki sıcaklık ve nem değerlerini tek ekrandan izlemek istiyordum — hazır akıllı ev ürünleri hem pahalı hem de veriyi kendi bulutlarına gönderiyor. Bunun yerine ESP8266 tabanlı sensör düğümleri kurdum: her düğüm ölçtüğü iklim verisini MQTT üzerinden, yerel ağımda çalışan Home Assistant sunucuma gönderiyor. Veri evden dışarı çıkmıyor, aylık ücret yok ve bir düğümün maliyeti hazır ürünlerin çok altında. Bu yazıda kendi kurulumumu, sıfırdan tekrarlanabilir şekilde adım adım anlatacağım.

1. Kullandığım Donanım

  • NodeMCU (ESP8266): WiFi'lı, USB'den programlanan geliştirme kartı. Sadece sıcaklık-nem okumak için ESP32'ye gerek yok; ESP8266 yeterli ve daha ucuz. Kartın pin dizilimine sitemdeki ESP8266/ESP32 pinout aracından bakabilirsiniz.
  • DHT22 (AM2302) sensörü: Tek pinden hem sıcaklık hem nem verir. Daha ucuz olan DHT11 de çalışır ama ölçüm aralığı dar ve hassasiyeti düşük; aradaki fiyat farkı DHT22'yi almaya değer.
  • Breadboard ve jumper kablolar — prototip aşaması için. Kalıcı kurulumda lehimleyip küçük bir kutuya alıyorum.
  • Güç: Prizden 5V USB adaptör (en dertsizi) veya pilli kullanım için 18650 lityum pil + şarj modülü (yazının sonunda deep sleep bölümüne bakın).
  • Home Assistant sunucusu: Bende yerel ağda çalışan bir Home Assistant kurulumu var; Raspberry Pi, mini PC veya sanal makine — hangisinde çalıştığı fark etmez, MQTT tarafı aynıdır.

2. Devre Bağlantısı

DHT22'nin üç pini kullanılır (dört bacaklı çıplak sensörde 3. bacak boştur):

  • DHT22 VCC → NodeMCU 3V3
  • DHT22 GND → NodeMCU GND
  • DHT22 DATA → NodeMCU D4 (GPIO2)

Çıplak DHT22 kullanıyorsanız DATA ile VCC arasına bir adet 10kΩ pull-up direnci bağlayın; üç pinli hazır modüllerde bu direnç kartın üzerinde zaten vardır. Hepsi bu — devrenin tamamı beş dakikalık iş.

3. Home Assistant Tarafı: Mosquitto Broker

MQTT, yayıncı-abone (publish/subscribe) mantığıyla çalışan çok hafif bir mesajlaşma protokolüdür: sensör bir konuya (topic) veri yayınlar, Home Assistant o konuya abone olur. Ortada mesajları dağıtan bir broker gerekir; ben Home Assistant'ın resmî eklentisi Mosquitto'yu kullanıyorum:

  1. Home Assistant'ta Ayarlar → Eklentiler → Eklenti Mağazası'ndan Mosquitto broker'ı kurup başlatın ("Başlangıçta çalıştır" açık olsun).
  2. Ayarlar → Kişiler'den sensörlerin kullanacağı ayrı bir kullanıcı oluşturun (örn. mqtt_kullanici) — kendi yönetici hesabınızın şifresini cihazlara gömmeyin.
  3. Ayarlar → Cihazlar ve Hizmetler'e gelin; Mosquitto çalışınca Home Assistant MQTT entegrasyonunu genellikle kendisi keşfeder, tek tıkla ekleyin.

Broker artık yerel ağda 1883 portundan dinliyor. Home Assistant sunucunuzun IP adresini not edin (örn. 192.168.1.10) — birazdan ESP koduna yazacağız.

4. ESP8266 Kodu

Kodu Arduino IDE ile yazıyorum. Hazırlık: Dosya → Tercihler'deki ek kart URL'lerine http://arduino.esp8266.com/stable/package_esp8266com_index.json adresini ekleyip Kart Yöneticisi'nden esp8266 paketini kurun; Kütüphane Yöneticisi'nden de PubSubClient (MQTT) ve DHT sensor library (Adafruit) kütüphanelerini yükleyin.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>

#define DHTPIN D4
#define DHTTYPE DHT22

const char* ssid        = "WIFI_ADINIZ";
const char* password    = "WIFI_SIFRENIZ";
const char* mqtt_server = "192.168.1.10";   // Home Assistant IP adresi
const char* mqtt_user   = "mqtt_kullanici";
const char* mqtt_pass   = "mqtt_sifre";

WiFiClient espClient;
PubSubClient client(espClient);
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) delay(500);
  client.setServer(mqtt_server, 1883);
}

void reconnect() {
  while (!client.connected()) {
    if (client.connect("esp8266-salon", mqtt_user, mqtt_pass)) break;
    delay(2000);
  }
}

void loop() {
  if (!client.connected()) reconnect();
  client.loop();

  float t = dht.readTemperature();
  float h = dht.readHumidity();
  if (!isnan(t) && !isnan(h)) {
    client.publish("ev/salon/sicaklik", String(t, 1).c_str(), true);
    client.publish("ev/salon/nem",      String(h, 1).c_str(), true);
  }
  delay(60000);   // 60 saniyede bir olc
}

Birkaç önemli ayrıntı:

  • publish()'in sonundaki true parametresi mesajı retained yapar: Home Assistant yeniden başladığında son ölçümü broker'dan hemen alır, sensörün bir sonraki yayınını beklemez.
  • isnan() kontrolü şart — DHT22 arada bir okuma kaçırır; kontrolsüz yayınlarsanız grafiğe NaN düşer.
  • Her oda için ev/salon/... yerine ev/yatak-odasi/... gibi ayrı topic ve client.connect() içinde farklı bir istemci adı kullanın; aynı istemci adına sahip iki cihaz broker'da sürekli birbirini düşürür.

5. Home Assistant'ta Sensör Tanımı

configuration.yaml dosyanıza şu bloğu ekleyip Home Assistant'ı yeniden başlatın:

mqtt:
  sensor:
    - name: "Salon Sıcaklık"
      state_topic: "ev/salon/sicaklik"
      unit_of_measurement: "°C"
      device_class: temperature
      state_class: measurement
    - name: "Salon Nem"
      state_topic: "ev/salon/nem"
      unit_of_measurement: "%"
      device_class: humidity
      state_class: measurement

device_class sayesinde Home Assistant doğru simgeyi ve birimi kendiliğinden kullanır; state_class: measurement ise uzun dönemli istatistik (aylık grafikler) tutulmasını sağlar. Artık panele bir sensör kartı ekleyip anlık değerleri ve geçmiş grafiğini izleyebilirsiniz. Sıcaklık belli eşiği aşınca bildirim göndermek de Home Assistant'ta birkaç tıklık otomasyon işidir.

6. Pilli Kullanım: Deep Sleep

Priz olmayan noktalara koyduğum düğümleri pille çalıştırıyorum. ESP8266 sürekli WiFi'da kalırsa ~70-80 mA çeker ve pili birkaç günde bitirir; çözüm deep sleep: cihaz ölçümü yapıp yayınladıktan sonra derin uykuya geçer (~20 µA), süresi dolunca kendini resetleyip baştan başlar.

// loop() sonundaki delay(60000) yerine:
client.disconnect();
delay(100);                          // MQTT paketinin gitmesini bekle
ESP.deepSleep(10 * 60 * 1000000ULL); // 10 dakika uyu (mikrosaniye)

Tek donanım şartı: uykudan uyanabilmesi için D0 (GPIO16) pinini RST pinine bir kabloyla bağlamak. (Dikkat: bu kablo takılıyken USB'den kod yükleme bazen başarısız olur — yükleme sırasında çıkarın.) Ölçüm aralığı, pil kapasitesi ve uyku akımına göre tahmini pil ömrünü sitemdeki pil ömrü hesaplayıcısıyla hesaplayabilirsiniz — 10 dakikalık aralıkla 18650 pil aylarca yetiyor.

7. Karşılaştığım Sorunlar ve İpuçları

  • DHT22'den arada NaN gelmesi normaldir; isnan() kontrolüyle o turu atlayın. Üst üste sürekli NaN geliyorsa kablo boyunu kısaltın veya pull-up direncini kontrol edin.
  • WiFi kopmaları: Modem yeniden başlayınca düğümler bağlantıyı kaybediyordu; loop() başında WiFi.status() kontrolü ekleyip kopmuşsa yeniden bağlanmak sorunu çözdü.
  • Test için MQTT trafiğini dinleyin: Home Assistant'ta Ayarlar → Cihazlar ve Hizmetler → MQTT → Yapılandır ekranındaki dinleme aracına ev/# yazın — tüm düğümlerin yayınını canlı görürsünüz. Sorun ESP tarafında mı Home Assistant tarafında mı, en hızlı böyle anlaşılır.
  • Sensörü karttan uzak tutun: DHT22'yi NodeMCU'ya bitişik monte etmeyin; kartın kendi ısısı sıcaklığı 1-2°C yukarı okutur. Ben birkaç santimetre kabloyla araya mesafe koyuyorum.

Sıkça Sorulan Sorular

ESP8266 yerine ESP32 kullanabilir miyim?

Evet. Kod neredeyse aynı kalır; ESP8266WiFi.h yerine WiFi.h kullanılır ve pin adları değişir. ESP32 daha fazla GPIO, Bluetooth ve güç sunar; ama sadece iklim verisi okuyacaksanız ESP8266 hem yeterli hem daha ucuzdur.

Bu sistem internet olmadan çalışır mı?

Evet — bu kurulumun en sevdiğim yanı. Broker da Home Assistant da yerel ağda çalıştığı için veri evden çıkmaz; internet kesilse bile sensörler yayınlamaya, panel göstermeye devam eder.

Pil ile ne kadar süre çalışır?

Deep sleep olmadan birkaç gün; deep sleep ile ölçüm aralığına bağlı olarak aylar. Kendi senaryonuz için pil ömrü hesaplayıcısını kullanın.

Sonuç

Özet reçete: (1) NodeMCU'ya DHT22'yi üç kabloyla bağlayın, (2) Home Assistant'a Mosquitto broker'ı kurup bir MQTT kullanıcısı açın, (3) yukarıdaki Arduino kodunu kendi WiFi/MQTT bilgilerinizle yükleyin, (4) configuration.yaml'a iki sensör tanımı ekleyin. İlk düğüm yaklaşık bir saatlik iş; sonrakiler için aynı kodda sadece topic ve istemci adını değiştiriyorum. Bulutsuz, aboneliksiz, tamamen yerel bir izleme sistemi olarak yıllardır sorunsuz çalışıyor — yeni bir oda eklemek artık benim için yarım saatlik keyifli bir akşam işi.

Bu yazı Ahmet Bilgiç tarafından ahmetbilgic.com için yazılmıştır. Diğer yazılar için: medium.com/@ahmet_bilgic07