IoT Otomasyon

Akıllı Ev MQTT Topic Yapısı: Odalar, Cihazlar ve Komutlar için En İyi Uygulamalar

Temiz bir topic düzeni her akıllı ev otomasyonunu kolaylaştırır. Oda/cihaz/özellik şemasını, komut ve state topic'lerinin nasıl ayrılacağını, ne zaman retained kullanılacağını ve hangi adlandırma hatalarından kaçınılacağını öğrenin.

Bir ev kök topic'inden dallanan odaları, cihazları ve özellikleri gösteren akıllı ev MQTT topic yapısı diyagramı
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

İyi bir akıllı ev MQTT topic yapısı, bir bakışta okunabilen otomasyonlarla kimsenin hatırlamadığı sensor1/temp2 topic'lerinden oluşan bir yumak arasındaki farktır. Bu rehberde kullanıma hazır bir oda/cihaz/özellik düzeni edinecek, komut ve state topic'lerinin neden ayrı olması gerektiğini öğrenecek ve retained mesajların, erişilebilirlik (availability) bilgisinin ve wildcard'ların gerçek bir broker üzerinde nasıl bir araya geldiğini göreceksiniz.

Topic Tasarımı Onuncu Cihazdan Önce Neden Önemlidir?

Üç cihazla her adlandırma işe yarar. Otuz cihaza ulaştığınızda ise topic adları şunların ne kadar kolay olacağını belirler:

  • tek bir wildcard ile "mutfaktaki her şeye" veya "evdeki her sıcaklık değerine" abone olmak,
  • her otomasyonu düzenlemeden yeni bir cihaz eklemek,
  • bir mesajın bir istek mi yoksa bir olgu mu olduğunu ayırt etmek,
  • bir topic gezgininde gerçekte ne olduğunu görmek.

MQTT hiçbir yapı dayatmaz. Topic'ler yalnızca / ile bölünmüş UTF-8 dizeleridir ve broker abonelikleri bunlarla eşleştirir. Bir kurala ihtiyaç duymanızın nedeni de tam olarak bu özgürlüktür. Broker'ın bu mesajları nasıl yönlendirdiğinin temelleri sizin için yeniyse, bir MQTT broker'ın ne yaptığını anlatan yazımızla başlayın.

Önerilen Düzen: Ev, Oda, Cihaz, Özellik

Çoğu ev için iyi ölçeklenen bir düzen şudur:

<home>/<room>/<device>/<property>[/set]

Örnekler:

home1/kitchen/ceiling-light/power            state: "ON" or "OFF" (retained)
home1/kitchen/ceiling-light/power/set        command: "ON", "OFF", "TOGGLE"
home1/kitchen/ceiling-light/brightness       state: 0-100 (retained)
home1/kitchen/ceiling-light/brightness/set   command: 0-100
home1/livingroom/climate/temperature         state: 21.6 (retained)
home1/livingroom/climate/humidity            state: 48 (retained)
home1/garage/door/state                      state: "open", "closed", "opening" (retained)
home1/garage/door/state/set                  command: "OPEN", "CLOSE"
home1/garage/door/availability               "online" or "offline" (retained, last will)

Bu sıralamanın neden işe yaradığı:

Seviye Amaç Wildcard örneği
home Mekânları ayırır (ev, yazlık, ebeveynlerin evi) home1/#
room İnsanların düşünme ve konuşma biçimine uyar home1/kitchen/#
device Tek bir fiziksel veya mantıksal cihaz home1/+/climate/#
property Tek bir değer veya yetenek home1/+/+/temperature
set soneki Bir olguyu değil, bir komutu işaretler home1/+/+/+/set

Derinliği beş seviye veya daha azında tutun. Derin ağaçları yazmak daha zordur ve herkese açık test broker'ı zaten topic'leri sekiz seviyeyle sınırlar; bu da bir ev için makul bir tavandır.

Akıllı Ev MQTT Topic Yapısında Komut ve State Topic'leri

En önemli tek kural: komutlar ve durum için asla aynı topic'i kullanmayın.

Bir lamba home1/kitchen/ceiling-light/power üzerinden hem dinler hem de raporlarsa, ON yayınlayan bir dashboard kendi mesajının geri yansıdığını görür, lambanın gerçekten yanıp yanmadığını anlayamaz; retained bir ON komutu da biri lambayı duvardaki anahtardan kapatmış olsa bile cihaz her yeniden bağlandığında lambayı tekrar açar.

Ayrı topic'lerle akış nettir:

  1. Dashboard .../power/set topic'ine ON yayınlar (retained değil).
  2. Cihaz röleyi çeker.
  3. Cihaz retain bayrağıyla .../power topic'ine ON yayınlar.
  4. Dashboard dahil her abone state topic'inden güncellenir.

State topic'i tek doğruluk kaynağı olur. Komutlar başarısız olabilecek isteklerdir; durumlar ise cihazın doğruladığı olgulardır.

Durumu retained yapın, komutları asla

Retained mesajlar, yeni bağlanan bir client'ın mevcut durumu hemen görmesini sağlar. Durumlar ve erişilebilirlik için istediğiniz tam olarak budur; komutlar için ise tam olarak istemediğiniz şey. Bir garaj kapısı komut topic'indeki retained bir OPEN, her elektrik kesintisinden sonra kendi kendine açılan bir kapı demektir. MQTT garaj kapısı açıcı eğitimimiz, bu deseni yanlış uygulamanın gerçek sonuçları olduğu bir projede gösteriyor.

QoS'u topic türüne göre seçin

Sensörlerden gelen durumlar için QoS 0 veya 1 yeterlidir; kaçırılan bir sıcaklık değerinin yerini bir sonraki alır. Komutlar en az bir kez iletilmeleri için QoS 1 kullanmalıdır ve cihazlar tekrarlanan komutları idempotent olarak ele almalıdır (iki kez ON yine açık demektir). Avantaj ve dezavantajlar için MQTT QoS seviyeleri yazımıza bakın.

Erişilebilirlik ve Last Will

Her cihaz bir availability topic'i yayınlamalıdır. Bağlandıktan sonra bunu online (retained) olarak ayarlayın ve aynı topic üzerinde offline (retained) değerine sahip bir last will mesajı yapılandırın. Cihaz elektriği veya Wi-Fi'ı kaybederse broker onun yerine will mesajını yayınlar ve dashboard'lar bayat bir değeri güncelmiş gibi göstermek yerine cihazı soluk gösterebilir.

// ESP32 with PubSubClient: last will on connect, then announce online
const char* AVAIL = "home1/garage/door/availability";
if (mqtt.connect(clientId, user, pass, AVAIL, 1, true, "offline")) {
  mqtt.publish(AVAIL, "online", true);
  mqtt.subscribe("home1/garage/door/state/set", 1);
}

Payload Kuralları

Topic yapısı ile payload biçimi el ele gider. Bir yaklaşım seçin ve her yerde onu kullanın:

  • Topic başına bir değer (.../temperature = 21.6) basittir, her araçla çalışır ve wildcard'ları güçlü kılar.
  • Cihaz başına JSON (.../climate = {"temperature":21.6,"humidity":48}) mesaj sayısını azaltır ve ilişkili değerleri tutarlı tutar.

Pek çok ev ikisini birden kullanır: Zigbee2MQTT veya ESPHome'dan gelen çok sensörlü cihazlar için JSON, kendin yap (DIY) cihazlar için tekil değerler. JSON kullanıyorsanız anahtarları belgeleyin ve birimleri ya anahtar adına (temp_c) ya da bir şema notuna ekleyin. Cihazlar arasında 21.6, "21.6" ve "21.6 C" biçimlerini karıştırmaktan kaçının.

Sorunları Önleyen Adlandırma Kuralları

  1. Küçük harfli, kısa çizgiyle ayrılmış adlar kullanın: Ceiling Light değil, ceiling-light.
  2. Adlarda boşluk, # veya + olmasın; başta / kullanmayın (boş bir ilk seviye oluşturur).
  3. Odaları insanların adlandırdığı gibi adlandırın, ancak değişecek adlardan kaçının (toms-room, Tom taşındığında garip kaçar; bedroom-2 kalıcıdır).
  4. Cihazları marka veya modele göre değil işlevlerine göre adlandırın; böylece donanımı yeniden adlandırmadan değiştirebilirsiniz.
  5. Sistem topic'leri için home1/system/backup-status gibi bir üst düzey önek ayırın.
  6. Topic adlarına asla gizli bilgiler, kapı kodları veya kişisel veriler koymayın; topic'ler eşleşen wildcard'lara sahip her abone tarafından görülebilir.

Ekosistem Topic'lerini Entegre Etmek

Her topic adını siz kontrol etmeyeceksiniz. Zigbee2MQTT zigbee2mqtt/<friendly_name> altında yayın yapar, Tasmota stat/, tele/ ve cmnd/ öneklerini kullanır, Home Assistant discovery ise homeassistant/<component>/<id>/config kullanır. Bu kurallarla savaşmayın. Bunun yerine:

  • Cihazlara oda/cihaz deseninizi izleyen kullanıcı dostu adlar verin; örneğin Zigbee2MQTT'de kitchen/ceiling-light verdiğinizde topic'leri zigbee2mqtt/kitchen/ceiling-light olur.
  • Kendi DIY cihazlarınızı home1/ kökünüzün altında tutun.
  • Home Assistant'ın her şeyi MQTT discovery aracılığıyla varlıklara (entity) eşlemesine izin verin.

Zigbee2MQTT kurulum rehberimiz, kullanıcı dostu adların topic'lere nasıl dönüştüğünü gösteriyor.

Düzeni Herkese Açık Bir Broker'da Deneyin

Yapıyı donanım olmadan test edebilirsiniz. Topic'lerinizin başkalarınınkiyle çakışmaması için rastgele bir önek kullanın:

# Terminal 1: watch the whole house
mosquitto_sub -h broker.connectmq.com -p 1883 -i watch-h7q2 -t "connectmq/demo/h7q2/home1/#" -v

# Terminal 2: a light reports retained state, then a dashboard sends a command
mosquitto_pub -h broker.connectmq.com -p 1883 -i light-h7q2 -r -q 1 \
  -t connectmq/demo/h7q2/home1/kitchen/ceiling-light/power -m ON
mosquitto_pub -h broker.connectmq.com -p 1883 -i dash-h7q2 -q 1 \
  -t connectmq/demo/h7q2/home1/kitchen/ceiling-light/power/set -m OFF

# Every temperature in the house, any room, any device
mosquitto_sub -h broker.connectmq.com -p 1883 -i temps-h7q2 -t "connectmq/demo/h7q2/home1/+/+/temperature" -v

Demo öneki üç seviye ekler; bu da kendi ağacınızı sığ tutmanız için bir neden daha. Herkese açık alan herkes tarafından okunabilir; bu yüzden onu gerçek eviniz için değil, yalnızca yapı denemeleri için kullanın. Özel bir broker'a geçtiğinizde demo önekini kaldırıp home1/ ile başlayabilirsiniz.

Akıllı Ev Topic Yapısı Kontrol Listesi

  1. Her cihaz <home>/<room>/<device>/<property> düzenini izler.
  2. Komutlar /set soneki kullanır ve asla retained yapılmaz.
  3. Durumlar retained'dır ve cihaz işlemi yaptıktan sonra cihaz tarafından yayınlanır.
  4. Her cihazın last will içeren bir availability topic'i vardır.
  5. Adlar küçük harfli, kısa çizgili ve işleve dayalıdır.
  6. Payload biçimi belgelenmiş ve tutarlıdır.
  7. Topic derinliği beş seviye veya daha azında kalır.

Evinizi Özel Bir Broker Üzerinde Çalıştırmak

Bir topic yapısı ancak üzerinde yaşadığı broker güvenli ve güvenilir olduğunda temiz kalır. ConnectMQ; 8883 portunda TLS, otomatik oluşturulan kimlik bilgileri ve oda/cihaz ağacınızın kolayca gezilebildiği canlı bir topic gezgini sunan yönetilen bir MQTT broker sağlar. Kendiniz barındırmak ile bir bulut MQTT broker kullanmak arasında karar veriyorsanız uzaktan erişimi, sertifikaları ve güncellemeleri düşünün. Daha fazla ev ve bina projesi için IoT otomasyon rehberine göz atın.

ConnectMQ ile Başlayın

Kredi kartı gerektirmeden app.connectmq.com adresinde ücretsiz bir Serverless broker oluşturun, oluşturulan kimlik bilgilerinizi kopyalayın ve ilk home1/ topic'lerinizi yayınlayın. ConnectMQ canlı topic gezgini tüm evinizi saniyeler içinde bir ağaç olarak gösterir.

Sık Sorulan Sorular

Topic'ler eğik çizgiyle mi başlamalı?

Hayır. Baştaki eğik çizgi boş bir ilk seviye oluşturur; bu geçerlidir ama kafa karıştırıcıdır ve kolayca yanlış yazılır. Evinizin veya mekânınızın adıyla başlayın.

Cihaz başına bir JSON topic'i mi yoksa değer başına bir topic mi kullanmak daha iyi?

Her ikisi de işe yarar. Değer başına bir topic, wildcard'lar ve DIY cihazlar için en basitidir; cihaz başına JSON ise çok sensörlü cihazlara uyar. Her cihaz türü için birini seçin ve belgeleyin.

Lambam yeniden başlatmadan sonra neden kendi kendine yanıyor?

Muhtemelen bir komut mesajını retained yaptınız. Komut topic'ine boş bir retained mesaj yayınlayarak onu temizleyin ve bundan sonra yalnızca state topic'lerini retained yapın.

Bir akıllı ev kaç topic seviyesi kullanmalı?

Dört veya beş fazlasıyla yeterlidir: ev, oda, cihaz, özellik ve isteğe bağlı bir set soneki. Daha derin ağaçlar yazma yükü ekler ve pek değer katmaz.

İ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.