İ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:
- Dashboard
.../power/settopic'ineONyayınlar (retained değil). - Cihaz röleyi çeker.
- Cihaz retain bayrağıyla
.../powertopic'ineONyayınlar. - 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ı
- Küçük harfli, kısa çizgiyle ayrılmış adlar kullanın:
Ceiling Lightdeğil,ceiling-light. - Adlarda boşluk,
#veya+olmasın; başta/kullanmayın (boş bir ilk seviye oluşturur). - 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-2kalıcıdır). - 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.
- Sistem topic'leri için
home1/system/backup-statusgibi bir üst düzey önek ayırın. - 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-lightverdiğinizde topic'lerizigbee2mqtt/kitchen/ceiling-lightolur. - 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
- Her cihaz
<home>/<room>/<device>/<property>düzenini izler. - Komutlar
/setsoneki kullanır ve asla retained yapılmaz. - Durumlar retained'dır ve cihaz işlemi yaptıktan sonra cihaz tarafından yayınlanır.
- Her cihazın last will içeren bir
availabilitytopic'i vardır. - Adlar küçük harfli, kısa çizgili ve işleve dayalıdır.
- Payload biçimi belgelenmiş ve tutarlıdır.
- 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.



