ESPHome MQTT desteği, YAML ile yapılandırılmış bir ESP32 veya ESP8266'nın sensör durumlarını Home Assistant native API yerine herhangi bir standart broker üzerinden yayınlamasını ve komut almasını sağlar. Bu eğitimde mqtt: bileşenini yapılandıracak, ESPHome'un ürettiği topic'leri anlayacak, üretim için TLS ve kimlik bilgileri ekleyecek ve gelen mesajlara doğrudan cihaz üzerinde tepki vereceksiniz.
Native API mi MQTT mi: Ne Zaman Geçmeli?
ESPHome'un native API'si, tek bir cihaz ile Home Assistant arasında verimli, şifreli, noktadan noktaya bir bağlantıdır. Cihazla konuşan tek şey Home Assistant olduğunda mükemmeldir. Ancak başka bir yazılım aynı veriye ihtiyaç duyduğu anda sınırlayıcı hale gelir: bir Node-RED akışı, bir Python kaydedicisi, Telegraf üzerinden bir Grafana hattı ya da LAN'ınıza erişemeyen ikinci bir konum.
MQTT bunu araya bir broker koyarak çözer. Cihaz bir kez yayın yapar ve istenen sayıda abone okumayı alır. Yeni bir tüketici eklediğinizde cihazda hiçbir şey değişmez ve NAT arkasındaki cihazlar internetteki bir broker'a yine de ulaşabilir. Publish/subscribe modelinde yeniyseniz, bir MQTT broker'ının ne yaptığına dair genel bakış iyi bir başlangıçtır.
| Özellik | Native API | ESPHome MQTT |
|---|---|---|
| Tüketiciler | Yalnızca Home Assistant | Herhangi bir MQTT istemcisi |
| Ağ yolu | HA cihaza ulaşmalı | Cihaz broker'a ulaşır (NAT arkasında çalışır) |
| Keşif | HA'da otomatik | MQTT discovery mesajları (isteğe bağlı) |
| Şifreleme | Noise protokolü anahtarı | Broker bağlantısında TLS |
| Ek altyapı | Yok | Bir broker |
İkisini aynı anda çalıştırabilirsiniz, ancak native API'yi artık hiçbir şey kullanmıyorsa, cihazın ona bellek harcamaması için api: bloğunu kaldırın.
Minimal Bir ESPHome MQTT Yapılandırması
Aşağıdaki örnek, DHT22 sensörü ve bir rölesi olan bir ESP32 için eksiksiz bir yapılandırmadır. Mesajları dakikalar içinde görebilmeniz için herkese açık test broker'ına bağlanır. Topic'lerinizin başkalarınınkiyle çakışmaması için a7k2q9 değerini kendi rastgele dizenizle değiştirin.
esphome:
name: greenhouse-node
friendly_name: Greenhouse Node
esp32:
board: esp32dev
framework:
type: esp-idf
logger:
level: INFO
wifi:
ssid: !secret wifi_ssid
password: !secret wifi_password
ota:
- platform: esphome
password: !secret ota_password
mqtt:
broker: broker.connectmq.com
port: 1883
client_id: esphome-greenhouse-a7k2q9
topic_prefix: connectmq/demo/a7k2q9/greenhouse
discovery: false
log_topic: null
birth_message:
topic: connectmq/demo/a7k2q9/greenhouse/status
payload: online
retain: true
will_message:
topic: connectmq/demo/a7k2q9/greenhouse/status
payload: offline
retain: true
sensor:
- platform: dht
pin: GPIO4
model: DHT22
update_interval: 30s
temperature:
name: "Air Temperature"
id: air_temp
humidity:
name: "Air Humidity"
id: air_hum
switch:
- platform: gpio
pin: GPIO26
name: "Vent Fan"
id: vent_fan
esphome run greenhouse-node.yaml ile yükleyin. Cihaz çevrimiçi olduğunda bilgisayarınızdan abone olun:
mosquitto_sub -h broker.connectmq.com -p 1883 -i sub-a7k2q9 \
-t 'connectmq/demo/a7k2q9/greenhouse/#' -v
Retained online durumunu ve her sensör için 30 saniyede bir durum mesajını görmelisiniz.
Anlaşılması gereken ayarlar
- client_id: boş olmamalı ve broker üzerinde benzersiz olmalıdır. İki cihaz aynı ID'yi paylaşırsa, broker yenisi her bağlandığında eski oturumu keser ve iki cihaz da sürekli kopup bağlanır.
- topic_prefix: varsayılan olarak düğüm adıdır. Açıkça belirlemek size öngörülebilir bir hiyerarşi sağlar ve herkese açık test alanını düzenli tutar.
- discovery: Home Assistant bu broker'ı kullanmıyorsa
falseolarak ayarlayın. Discovery,homeassistant/altında retained yapılandırma mesajları yayınlar; bunlar paylaşılan herkese açık bir broker'da herkes tarafından görülebilir. - log_topic: ESPHome varsayılan olarak günlüklerini
<prefix>/debugtopic'ine yansıtır. Bununullyapmak, geveze bir cihazın hız sınırlarını tüketmesini önler.
ESPHome'un Yayınladığı Topic'ler
ESPHome topic'leri önekten, bileşen türünden ve varlık adından türetilen bir nesne kimliğinden (küçük harf, boşluklar alt çizgiye dönüşür) oluşturur.
| Varlık | State topic | Command topic |
|---|---|---|
| Air Temperature sensörü | <prefix>/sensor/air_temperature/state |
yok |
| Air Humidity sensörü | <prefix>/sensor/air_humidity/state |
yok |
| Vent Fan anahtarı | <prefix>/switch/vent_fan/state |
<prefix>/switch/vent_fan/command |
| Erişilebilirlik | <prefix>/status |
yok |
Durumlar düz dizelerdir: bir sensör için 23.4, bir anahtar için ON veya OFF. Fanı komut satırından açmak için:
mosquitto_pub -h broker.connectmq.com -p 1883 -i pub-a7k2q9 \
-t 'connectmq/demo/a7k2q9/greenhouse/switch/vent_fan/command' -m 'ON'
Cihaz komutu uygular ve ardından yeni durumu ilgili state topic'inde yayınlar; böylece paneller her zaman istenen şeyi değil, gerçekte olanı yansıtır.
Farklı bir topic düzeni gerekiyorsa, her bileşen state_topic ve command_topic geçersiz kılmalarını kabul eder. Bu, akıllı ev MQTT topic yapısı rehberinde anlatılan gibi mevcut bir yapınız olduğunda kullanışlıdır.
sensor:
- platform: dht
pin: GPIO4
model: DHT22
temperature:
name: "Air Temperature"
state_topic: connectmq/demo/a7k2q9/site1/greenhouse/temperature
Cihaz Üzerinde MQTT Mesajlarına Tepki Verme
MQTT bileşeni yalnızca bir çıkış değildir. on_message veya on_json_message ile herhangi bir topic'ten otomasyon tetikleyebilir, mqtt.publish ve mqtt.publish_json eylemleriyle istediğiniz payload'ları yayınlayabilirsiniz.
mqtt:
# ... yukarıdaki bağlantı ayarları ...
on_message:
- topic: connectmq/demo/a7k2q9/greenhouse/mode
payload: "night"
then:
- switch.turn_off: vent_fan
on_json_message:
topic: connectmq/demo/a7k2q9/greenhouse/setpoint
then:
- lambda: |-
if (x.containsKey("max_temp")) {
id(max_temp) = x["max_temp"];
}
globals:
- id: max_temp
type: float
restore_value: true
initial_value: '28.0'
interval:
- interval: 60s
then:
- if:
condition:
lambda: 'return id(air_temp).state > id(max_temp);'
then:
- switch.turn_on: vent_fan
- mqtt.publish_json:
topic: connectmq/demo/a7k2q9/greenhouse/event
payload: |-
root["event"] = "overheat";
root["temp"] = id(air_temp).state;
Bu, basit bir güvenlik kuralını cihazın kendisinde tutar; böylece ağ çöktüğünde bile fan çalışmaya devam eder, ayar noktası ise {"max_temp": 30} yayınlanarak uzaktan değiştirilebilir.
Üretim Kurulumu: TLS ve Kimlik Bilgileri
Herkese açık test alanı denemeler için uygundur, ancak oradaki her topic'i herkes okuyabilir. Gerçek bir kurulum için özel bir broker oluşturun ve üretilen kimlik bilgilerini kullanın. ESP-IDF framework'lü ESP32'de ESPHome, broker sertifikasını imzalayan CA sertifikasını sağlayarak TLS'yi destekler. ConnectMQ bir Let's Encrypt sertifikası kullanır, dolayısıyla CA ISRG Root X1'dir.
mqtt:
broker: broker.connectmq.com
port: 8883
client_id: YOUR_CLIENT_ID
username: YOUR_USERNAME
password: !secret mqtt_password
topic_prefix: site1/greenhouse
discovery: false
log_topic: null
certificate_authority: |
-----BEGIN CERTIFICATE-----
(paste the ISRG Root X1 certificate here)
-----END CERTIFICATE-----
birth_message:
topic: site1/greenhouse/status
payload: online
retain: true
will_message:
topic: site1/greenhouse/status
payload: offline
retain: true
Parolanın sürüm kontrolüne düşmemesi için ana dosya yerine secrets.yaml içinde tutun. ConnectMQ'da client ID verilen kimlik bilgilerine bağlı olduğundan, onu portaldan birebir kopyalayın.
ESP8266 kartlarında çok daha az RAM bulunur ve tam sertifika doğrulaması bunlar için zorlayıcıdır. ESP8266'da TLS kullanmanız şartsa, desteklenen seçenekler için güncel ESPHome belgelerine bakın ya da projeyi TLS'yi rahatça kaldıran bir ESP32'ye taşıyın.
Home Assistant'ı ve Diğer Araçları Beslemek
Cihaz bir broker'a bağlandığında Home Assistant, birçok tüketiciden biri haline gelir. MQTT entegrasyonunu aynı broker'a yönlendirin (Home Assistant için harici MQTT broker rehberi bunu adım adım anlatır) ve varlıkların otomatik görünmesi için cihazda discovery: true ayarlayın. Retained config payload'ları dahil discovery ayrıntıları Home Assistant MQTT discovery yazısında açıklanıyor.
Aynı anda bir Node-RED akışı her sensörü kaydetmek için site1/+/sensor/+/state topic'ine abone olabilir ve bir Python betiği okumaları bir veritabanına arşivleyebilir. Hiçbirinin cihazın IP adresini bilmesi gerekmez.
ESPHome MQTT Sorun Giderme
- Cihaz bağlanıyor, sonra birkaç saniyede bir kopuyor. Neredeyse her zaman yinelenen bir client ID'dir. Başka bir cihazın veya unutulmuş bir test betiğinin aynı ID'yi kullanmadığını kontrol edin.
- Hiç mesaj görünmüyor. Aboneliğin, büyük/küçük harf dahil öneke birebir uyduğunu doğrulayın. Dalınızdaki her şeyi görmek için
connectmq/demo/a7k2q9/#topic'ine abone olun. - TLS el sıkışması başarısız. Cihazın saatinin doğru olduğunu (TLS buna ihtiyaç duyar; ESPHome SNTP ile senkronize eder), PEM bloğunun tamamını yapıştırdığınızı ve 8883 portunda olduğunuzu doğrulayın.
- Herkese açık broker'da mesajlar düşüyor. Test alanı istemci başına saniyede 10 mesaja ve mesaj başına 64 KB'a izin verir. Debug topic'indeki günlükler veya çok kısa güncelleme aralıkları bunu aşabilir.
- Komutlar yok sayılıyor.
statetopic'ine değilcommandtopic'ine yayın yapın ve anahtarlar için büyük harfleONveyaOFFkullanın.
Topic ağacını canlı bir gezginde izlemek bu sorunların çoğunu saniyeler içinde görünür kılar; bu yüzden yükleme yaparken portalın topic gezginini veya ConnectMQ Desktop uygulamasını açmaya değer.
Birkaç Düğümün Ötesine Ölçeklenme
Broker çalıştıran tek bir Raspberry Pi, bir noktaya kadar iş görür: SD kart arızaları, elektrik kesintileri ve uzaktan erişim için port yönlendirme sizin sorununuz haline gelir. Yönetilen bir MQTT broker'ına geçmek bu bakımı ortadan kaldırır ve her ESPHome düğümüne her ağdan çalışan sabit bir TLS uç noktası sağlar. Cihazları, broker'ları ve otomasyon mantığını bir araya getirmenin genel resmi IoT otomasyon rehberinde ele alınıyor.
ESPHome Cihazlarınızı ConnectMQ'ya Bağlayın
ConnectMQ size 8883 portunda TLS'li özel bir broker, üretilmiş kullanıcı adı, parola ve client ID ile ESPHome düğümlerinizin raporlarını izleyebileceğiniz canlı bir topic gezgini sunar. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun, kimlik bilgilerini secrets.yaml dosyasına yapıştırın ve yükleyin.
Sık Sorulan Sorular
ESPHome MQTT ile native API'yi aynı anda kullanabilir miyim?
Evet. Her iki bileşen birlikte etkinleştirilebilir; bu, geçiş sırasında kullanışlıdır. Hiçbir şey ona bağlı kalmadığında bellek tasarrufu için api: bloğunu kaldırın.
ESPHome MQTT, Home Assistant olmadan çalışır mı?
Evet. discovery: false ile cihaz yalnızca durumları yayınlar ve komutları dinler; herhangi bir MQTT istemcisi bunları kullanabilir.
ESPHome cihazım neden broker'a sürekli yeniden bağlanıyor?
En yaygın neden, iki istemcinin aynı client ID'yi kullanmasıdır. Her cihaza benzersiz bir client_id verin veya broker kimlik bilgilerinizle verilen ID'yi birebir kullanın.
ESPHome hangi QoS'u kullanır?
Durum mesajları varsayılan olarak QoS 0 kullanır. Teslimat garantisine ihtiyacınız varsa, MQTT QoS seviyeleri rehberinde açıklandığı gibi qos değerini bileşen bazında veya birth_message ve will_message içinde ayarlayabilirsiniz.



