IoT Otomasyon

ESP32, Röle ve Reed Anahtarla Kendin Yap MQTT Garaj Kapısı Açıcı

Mevcut garaj kapısı motorunuzu bir ESP32, sizin yerinize duvar butonuna basan bir röle ve kapının gerçek durumunu retained MQTT mesajı olarak bildiren bir reed anahtarla akıllı hâle getirin.

Bir ESP32, röle modülü ve kapı kasasındaki manyetik reed anahtarla yapılmış MQTT garaj kapısı açıcı
Bunu kendi MQTT broker’ınızda çalıştırınFree planla özel, yönetilen bir MQTT broker alın ve hazır kod örnekleriyle başlayın.
Ücretsiz deneyin Kod örnekleri Kart gerekmez

Bir MQTT garaj kapısı açıcı, zaten sahip olduğunuz motoru kullanarak garaj kapınızı her yerden açmanızı, kapatmanızı ve en önemlisi kontrol etmenizi sağlar. Bu eğitimde bir ESP32'yi duvar butonuna "basan" bir röleye ve kapının gerçekten kapalı olup olmadığını bildiren bir reed anahtara bağlayacak, ardından bu durumu retained bir MQTT mesajı olarak yayınlayacaksınız; böylece her uygulama bağlandığı anda gerçeği görür.

Açıcı Nasıl Çalışır?

Neredeyse her ev tipi garaj kapısı motorunda bir duvar butonu için terminaller bulunur. Bu iki terminali kısa süreliğine kısa devre yapmak butona basmakla aynıdır: kapı, bulunduğu konuma göre harekete başlar, durur veya yön değiştirir. Bu da donanım tarafını basit ve müdahalesiz kılar:

  • Duvar butonuna paralel bağlanan bir röle 500 ms'lik bir "basma" sağlar.
  • Kasaya takılan ve kapıda bir mıknatısla eşleşen bir reed anahtar, kapı tamamen kapandığında kapanır.
  • ESP32 komutları dinler, röleyi tetikler ve reed anahtarın durumunu yayınlar.

Temel tasarım tercihi, açıcının kapının ne yaptığını asla varsaymamasıdır. Sensörün gördüğünü yayınlar. Komut bir istektir; reed anahtar ise olgudur.

Malzeme Listesi

Parça Amaç
ESP32 DevKit Wi-Fi ve MQTT client'ı
1 kanallı, 3,3 V uyumlu röle modülü (veya optokuplörlü 5 V modül) Duvar butonu terminallerini kısa devre yapar
Manyetik reed anahtar, normalde açık, yüzeye montaj Tamamen kapalı kapıyı algılar
İsteğe bağlı ikinci reed anahtar Tamamen açık kapıyı algılar
5 V USB güç kaynağı ve kutu Güç ve tozdan koruma
İki damarlı zil kablosu Röleden motor terminallerine, reed'den ESP32'ye

Herhangi bir şeyi bağlamadan önce açıcınızın kılavuzunu kontrol edin. Bazı yeni motorlar kuru kontak yerine dijital bir duvar paneli kullanır; bunlar uyumlu bir arayüz veya butonu röleye bağlanmış yedek bir uzaktan kumanda gerektirir.

Bağlantılar

Nereden Nereye Notlar
Röle IN GPIO 26 Aktif seviye modülünüze bağlıdır
Röle VCC / GND 5V / GND Optokuplörlü modüller ayrı bir JD-VCC gerektirebilir
Röle COM ve NO Motordaki duvar butonu terminalleri Mevcut butona paralel
Reed anahtar (kapalı konum) GPIO 27 ve GND Dahili pull-up kullanır
Reed anahtar (açık konum, isteğe bağlı) GPIO 25 ve GND Dahili pull-up kullanır

INPUT_PULLUP ile kapalı bir reed anahtar LOW okur. Kapalı konum reed'ini, mıknatıs yalnızca kapı tamamen indiğinde yaklaşık bir santimetre mesafede olacak şekilde monte edin.

MQTT Garaj Kapısı Açıcı için Topic Tasarımı

Akıllı ev MQTT topic yapısı rehberimizdeki kurallara göre:

<base>/garage/door/state          retained: "closed", "open", "opening/closing", "unknown"
<base>/garage/door/state/set      command: "OPEN", "CLOSE", "PRESS" (never retained)
<base>/garage/door/availability   retained: "online" / "offline" via last will

State topic'ini retained yapmak, telefonunuzdaki dashboard'un bir sonraki değişikliği beklemek yerine bağlanır bağlanmaz "kapalı" göstermesi demektir. Komut topic'ini asla retained yapmamak ise bir elektrik kesintisinin eski bir OPEN komutunu yeniden oynatıp kapıyı kendi kendine açamaması demektir.

ESP32 Sketch'i

Sketch PubSubClient kullanır. Motor yerine bir LED ile herkese açık broker'da test ederken BENCH_TEST değerini true yapın; TLS'li özel broker'ınız için false yapın.

#include <WiFi.h>
#include <WiFiClientSecure.h>
#include <PubSubClient.h>

#define BENCH_TEST true

const char* WIFI_SSID = "YOUR_WIFI";
const char* WIFI_PASS = "YOUR_WIFI_PASSWORD";
const char* BROKER    = "broker.connectmq.com";

#if BENCH_TEST
  const char* BASE = "connectmq/demo/g4k9t2";   // random prefix, public area
  const char* CLIENT_ID = "garage-g4k9t2";
  const char* MQTT_USER = nullptr;
  const char* MQTT_PASS = nullptr;
  WiFiClient net;
  const uint16_t PORT = 1883;
#else
  const char* BASE = "home1";
  const char* CLIENT_ID = "YOUR_CLIENT_ID";
  const char* MQTT_USER = "YOUR_USERNAME";
  const char* MQTT_PASS = "YOUR_PASSWORD";
  const char* ROOT_CA = R"EOF(
-----BEGIN CERTIFICATE-----
...paste the ISRG Root X1 certificate here...
-----END CERTIFICATE-----
)EOF";
  WiFiClientSecure net;
  const uint16_t PORT = 8883;
#endif

const int RELAY_PIN = 26;
const int REED_CLOSED_PIN = 27;
const int REED_OPEN_PIN = 25;
const bool RELAY_ACTIVE = HIGH;            // change to LOW for active-low modules
const unsigned long PRESS_MS = 500;
const unsigned long TRAVEL_TIMEOUT_MS = 30000;

PubSubClient mqtt(net);
String tState, tSet, tAvail;
String lastState = "";
unsigned long lastPressAt = 0;

String readDoor() {
  bool closed = digitalRead(REED_CLOSED_PIN) == LOW;
  bool open = digitalRead(REED_OPEN_PIN) == LOW;
  if (closed) return "closed";
  if (open) return "open";
  if (millis() - lastPressAt < TRAVEL_TIMEOUT_MS) return "opening/closing";
  return "unknown";   // stopped halfway or the open sensor is missing
}

void pressButton() {
  if (millis() - lastPressAt < 2000) return;   // ignore rapid repeats
  digitalWrite(RELAY_PIN, RELAY_ACTIVE);
  delay(PRESS_MS);
  digitalWrite(RELAY_PIN, !RELAY_ACTIVE);
  lastPressAt = millis();
}

void onMessage(char* topic, byte* payload, unsigned int len) {
  String cmd;
  for (unsigned int i = 0; i < len; i++) cmd += (char)payload[i];
  cmd.trim();
  cmd.toUpperCase();
  String door = readDoor();
  if (cmd == "OPEN" && door == "closed") pressButton();
  else if (cmd == "CLOSE" && door == "open") pressButton();
  else if (cmd == "PRESS") pressButton();
  // OPEN while open or CLOSE while closed is ignored on purpose
}

void connectMqtt() {
  while (!mqtt.connected()) {
    if (mqtt.connect(CLIENT_ID, MQTT_USER, MQTT_PASS, tAvail.c_str(), 1, true, "offline")) {
      mqtt.publish(tAvail.c_str(), "online", true);
      mqtt.subscribe(tSet.c_str(), 1);
      lastState = "";   // force a fresh retained state
    } else {
      delay(5000);
    }
  }
}

void setup() {
  pinMode(RELAY_PIN, OUTPUT);
  digitalWrite(RELAY_PIN, !RELAY_ACTIVE);
  pinMode(REED_CLOSED_PIN, INPUT_PULLUP);
  pinMode(REED_OPEN_PIN, INPUT_PULLUP);

  tState = String(BASE) + "/garage/door/state";
  tSet   = tState + "/set";
  tAvail = String(BASE) + "/garage/door/availability";

  WiFi.begin(WIFI_SSID, WIFI_PASS);
  while (WiFi.status() != WL_CONNECTED) delay(500);
#if !BENCH_TEST
  net.setCACert(ROOT_CA);
#endif
  mqtt.setServer(BROKER, PORT);
  mqtt.setCallback(onMessage);
}

void loop() {
  if (!mqtt.connected()) connectMqtt();
  mqtt.loop();

  static unsigned long lastCheck = 0;
  if (millis() - lastCheck > 200) {
    lastCheck = millis();
    String s = readDoor();
    if (s != lastState) {
      mqtt.publish(tState.c_str(), s.c_str(), true);   // retained state
      lastState = s;
    }
  }
}

Dikkat edilmesi gereken birkaç ayrıntı:

  • OPEN röleyi yalnızca kapı closed okuduğunda, CLOSE ise yalnızca open okuduğunda tetikler. Tek bir basış motoru tersine çevirdiğinden, açık bir kapıya OPEN göndermek aksi hâlde kapıyı kapatırdı.
  • Birbirine iki saniyeden yakın basışlar yok sayılır; bu, iki kez dokunulan bir butonun veya yeniden denenen bir QoS 1 mesajının kapıyı tersine çevirmesini engeller.
  • 200 ms'lik yoklama, reed anahtar için basit bir debounce işlevi görür.

Tezgâhta Test

Röle çıkışına dirençli bir LED bağlayın (veya sadece rölenin tıklamasını dinleyin), BENCH_TEST değerini true bırakın ve kartı yükleyin. Ardından bir terminalden:

B=connectmq/demo/g4k9t2
mosquitto_sub -h broker.connectmq.com -p 1883 -i mon-g4k9t2 -t "$B/garage/#" -v
mosquitto_pub -h broker.connectmq.com -p 1883 -i cmd-g4k9t2 -q 1 -t $B/garage/door/state/set -m PRESS

Bir mıknatısı reed anahtarın önünden geçirin ve durumun değişmesini izleyin. ESP32'nin fişini çekin; keep-alive zaman aşımından sonra broker availability topic'ine offline yayınlar.

Herkese açık broker'ı kullanırken gerçek kapı motorunu bağlamayın. Topic'inizi tahmin eden herkes orayı okuyabilir ve oraya yayın yapabilir. Önce özel kimlik bilgilerine geçin.

Özel Bir Broker'da Canlıya Geçmek

BENCH_TEST değerini false yapın, ISRG Root X1 sertifikasını (Let's Encrypt kök sertifikası) yapıştırın ve ConnectMQ portalında oluşturulan kullanıcı adı, parola ve client ID'yi doldurun. Artık açıcı 8883 portunda TLS üzerinden bağlanır ve yalnızca sizin kimlik bilgilerinize sahip client'lar ona komut verebilir. MQTT güvenliği en iyi uygulamaları yazımız, kapı açan her şey için kimlik bilgilerinin ve TLS'in neden pazarlık konusu olmadığını açıklıyor.

Home Assistant'tan kontrol etmek için aynı topic'leri gösteren bir MQTT cover varlığı ekleyin veya Home Assistant MQTT rehberini izleyin:

mqtt:
  cover:
    - name: "Garage Door"
      command_topic: "home1/garage/door/state/set"
      state_topic: "home1/garage/door/state"
      availability_topic: "home1/garage/door/availability"
      payload_open: "OPEN"
      payload_close: "CLOSE"
      payload_stop: "PRESS"
      state_open: "open"
      state_closed: "closed"
      state_opening: "opening/closing"
      qos: 1

Güvenlik Kontrol Listesi

  1. Motorun kendi güvenlik özelliklerini (fotosel, otomatik geri dönüş) bağlı ve çalışır durumda tutun.
  2. Komut mesajlarını asla retained yapmayın.
  3. OPEN/CLOSE komutlarına yalnızca sensör karşıt durumu doğruladığında işlem yapın.
  4. Motoru bağlamadan önce TLS ve özel kimlik bilgileri kullanın.
  5. Kapı beklediğinizden uzun süre open kaldığında bir bildirim ekleyin.
  6. Röleyi hareketli parçalardan uzakta bir kutunun içine monte edin.
  7. Wi-Fi hareket sırasında koptuğunda ne olduğunu test edin: kapı hareketini basitçe tamamlamalıdır.

"Kapı açık kaldı" bildirimi için ConnectMQ portalındaki eşik tabanlı alarm kuralları bir topic'teki değerleri işaretleyebilir veya Home Assistant ya da Node-RED'deki bir otomasyon on dakikadan uzun süren open durumunu izleyebilir.

Sorun Giderme

Röle tıklıyor ama kapı hareket etmiyor. Motorunuz muhtemelen dijital bir duvar paneli kullanıyor. Bunun yerine röleyi yedek bir uzaktan kumandanın butonuna bağlayın.

Durum kapalı ile bilinmiyor arasında gidip geliyor. Mıknatıs reed anahtardan çok uzakta veya kapı sarsılıyor. Onları birbirine yaklaştırın veya daha uzun bir debounce ekleyin.

OPEN gönderdiğinizde kapı ters yöne gidiyor. PRESS gönderiyorsunuz veya kapalı sensörü LOW okumuyor. Reed bağlantısını seri monitörle kontrol edin.

Cihaz bir daha çevrimiçi olmuyor. Client ID'nin benzersiz olduğunu kontrol edin; aynı kimliğe sahip iki cihaz birbirini bağlantıdan atar. Özel bir broker'da, client ID'ler kimlik bilgilerine bağlı olduğundan, kimlik bilgilerinizle birlikte verilen client ID'yi tam olarak kullandığınızdan da emin olun.

Komutlar geç veya iki kez geliyor. QoS 1 en az bir kez teslimatı garanti eder; bu yüzden yeniden denenen bir mesaj yeniden bağlantıdan sonra gelebilir. İki saniyelik basma kilidi ve onMessage içindeki durum kontrolleri tekrarları zararsız hâle getirir.

Garajınızı ConnectMQ ile Güvenle Kontrol Edin

Bir kapı açıcı, herkese açık değil, özel ve şifreli bir broker'ı hak eder. ConnectMQ; TLS, otomatik oluşturulan kimlik bilgileri ve kapı durumunuzu izlemek için canlı bir topic gezgini sunan tam yönetilen bir MQTT servisidir. Kredi kartı gerektirmeden app.connectmq.com adresinde ücretsiz bir Serverless broker oluşturun, BENCH_TEST değerini false yapın ve canlıya geçin. Barındırma hakkında arka plan bilgisi için buluttaki MQTT broker yazımızı okuyun; IoT ile su kaçağı tespiti gibi daha fazla projeye de IoT otomasyon rehberimizden göz atın.

Sık Sorulan Sorular

Bu her garaj kapısı motoruyla çalışır mı?

Ev tipi açıcıların çoğunu kapsayan, basit kuru kontaklı duvar butonu kabul eden motorlarla çalışır. Dijital duvar paneli olan motorlar ise bunun yerine röleye bağlanmış yedek bir uzaktan kumanda gerektirir.

Komutları takip etmek yerine neden bir reed anahtar kullanmalı?

Komutlar başarısız olabilir, kapı bir engel tarafından durdurulabilir veya biri normal uzaktan kumandayı kullanabilir. Kapının gerçekte nerede olduğunu size yalnızca bir sensör söyler.

Bir garaj kapısını MQTT üzerinden kontrol etmek güvenli mi?

TLS, özel kimlik bilgileri ve retained olmayan komutlar kullandığınızda ve motorun yerleşik güvenlik geri dönüşünü koruduğunuzda makuldür. Gerçek bir kapıyı asla herkese açık bir test broker'ına bağlamayın.

Tamamen açık konum için ikinci bir sensör ekleyebilir miyim?

Evet. Sketch, GPIO 25 üzerindeki isteğe bağlı açık konum reed'ini zaten okuyor; bu da "unknown" durumunu net bir "open" durumuna dönüştürür.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

7 dk okuma

Tüm yazılar →

Özel MQTT broker’ınız birkaç tık uzağınızda

Hesabınızı oluşturun, broker kimlik bilgilerinizi alın ve ilk cihazınızı bağlayın — kurulacak, yamalanacak ya da ölçeklendirilecek sunucu yok.