IoT Otomasyon

ESPHome MQTT: Native API Yerine MQTT Kullanmak

Bir ESPHome cihazını native API'den MQTT'ye geçirin; böylece Node-RED, Python betikleri, paneller ve Home Assistant tek bir broker üzerinden onu okuyup kontrol edebilsin.

Bir ESP32 sensör düğümünün birden fazla tüketicinin okuduğu bir bulut broker'ına durum topic'leri yayınladığını gösteren ESPHome MQTT 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

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 false olarak 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>/debug topic'ine yansıtır. Bunu null yapmak, 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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Komutlar yok sayılıyor. state topic'ine değil command topic'ine yayın yapın ve anahtarlar için büyük harfle ON veya OFF kullanı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.

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