IoT Otomasyon

Home Assistant MQTT Otomasyonu: Tetikleyiciler, Şablonlar ve Yayın Eylemleri

Home Assistant otomasyonlarını ham MQTT mesajlarından tetikleyin, şablonlar ve wildcard'larla filtreleyin ve mqtt.publish eylemiyle cihazlara komutları geri yayınlayın.

MQTT tetikleyici, şablon koşulu ve bir cihaza yayın eylemi içeren Home Assistant MQTT otomasyon akışı
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 Home Assistant MQTT otomasyonu, broker'daki bir topic'e gelen mesajlara tepki verir ve geri mesaj yayınlayabilir; bu da hiçbir zaman varlık (entity) olarak görünmeyen cihazları ve betikleri otomatikleştirmenizi sağlar. Bu eğitimde Home Assistant'ı bir broker'a bağlayacak, MQTT tetikleyicileriyle otomasyonlar yazacak, JSON payload'larına ve wildcard topic'lere göre filtreleyecek, mqtt.publish ile komutlar yayınlayacak ve çoğu kişiyi tuzağa düşüren döngülerden ve yarış koşullarından kaçınacaksınız.

Varlıklar mı, Ham Topic'ler mi?

Home Assistant MQTT'yi kullanmanın iki yolunu sunar. Birincisi varlıklardır: YAML ile tanımlanan veya discovery ile oluşturulan MQTT sensörleri, anahtarları ve lambaları. Otomasyonlar bu durumda sıradan durum tetikleyicilerini kullanır. İkincisi, arada herhangi bir varlık olmadan doğrudan bir mesajla tetiklenen MQTT tetikleyicisidir.

Şu durumlarda varlık ve durum tetikleyicisi kullanın Şu durumlarda MQTT tetikleyicisi kullanın
Geçmiş, grafikler ve bir panel kutucuğu istiyorsanız Mesaj bir durum değil, bir olaysa (düğme basma, alarm, RFID okuma)
Değer uzun ömürlüyse (sıcaklık, anahtar durumu) Payload'ların yapısı değişkense veya birden fazla alan taşıyorsa
Diğer otomasyonlar aynı değeri yeniden kullanıyorsa Tek bir otomasyon bir wildcard ile birçok cihazı işlemeliyse

İki yaklaşım birlikte çalışır. Tipik bir kurulum durumlar için varlıkları, olaylar için MQTT tetikleyicilerini kullanır. Henüz varlık tanımlamadıysanız Home Assistant MQTT ve MQTT discovery rehberi ile başlayın.

Home Assistant'ı Broker'a Bağlama

Settings > Devices & services > Add integration > MQTT yolunu açın ve broker bilgilerini girin. Bir test çalışması için anonim bağlantıları kabul eden broker.connectmq.com adresindeki herkese açık MQTT test broker'ını kullanabilirsiniz:

Alan Test değeri Üretim değeri
Broker broker.connectmq.com broker.connectmq.com
Port 1883 8883
Username / Password boş YOUR_USERNAME / YOUR_PASSWORD
Client ID (gelişmiş) ha-<random> YOUR_CLIENT_ID
Broker certificate validation (gelişmiş) kapalı Auto

Gelişmiş seçenekler yalnızca kullanıcı profilinizde Advanced mode etkinse görünür. Herkese açık test alanı paylaşımlıdır ve herkes tarafından okunabilir; bu yüzden connectmq/demo/k9p4z7/ gibi benzersiz bir önek kullanın ve oraya asla hassas bir şey göndermeyin. Üretime yönelik eksiksiz anlatım Home Assistant'ı harici bir MQTT broker'ına bağlama yazısında yer alıyor.

İlk Home Assistant MQTT Otomasyonunuz

Aşağıdaki otomasyon, kablosuz bir düğme pressed yayınladığında bir lambayı açar. Güncel otomasyon sözdizimini (triggers:, trigger: mqtt, actions:) kullanır.

alias: Greenhouse button turns on grow light
triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/greenhouse/button
    payload: pressed
actions:
  - action: light.turn_on
    target:
      entity_id: light.grow_light
mode: single

Bir terminalden test edin:

mosquitto_pub -h broker.connectmq.com -p 1883 -i btn-k9p4z7 \
  -t 'connectmq/demo/k9p4z7/greenhouse/button' -m 'pressed'

payload filtresi ham dizeyi birebir karşılaştırır. Cihaz JSON gönderiyorsa, önce bir alanı çıkarmak için value_template kullanın; payload değeri bu durumda şablonun sonucuyla eşleştirilir.

triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/greenhouse/button
    value_template: "{{ value_json.action }}"
    payload: double

Tetikleyici Verisini Şablonlarda Kullanma

Otomasyonun içinde trigger değişkeni mesajla ilgili her şeyi taşır: trigger.topic, trigger.payload, trigger.payload_json (payload JSON olarak ayrıştırılabiliyorsa), trigger.qos ve trigger.retain. Bu, tek bir otomasyonu esnek bir işleyiciye dönüştürür.

alias: Notify on soil moisture alert
triggers:
  - trigger: mqtt
    topic: connectmq/demo/k9p4z7/garden/+/alert
conditions:
  - condition: template
    value_template: "{{ trigger.payload_json.moisture | float(100) < 25 }}"
actions:
  - action: notify.mobile_app_phone
    data:
      title: "Dry soil"
      message: >
        Bed {{ trigger.topic.split('/')[4] }} is at
        {{ trigger.payload_json.moisture }}% moisture.
mode: queued
max: 10

+ wildcard'ı tek bir seviyeyle eşleşir; böylece tek bir otomasyon tüm tarhları kapsar. trigger.topic.split('/')[4], tarh adını connectmq/demo/k9p4z7/garden/<bed>/alert içinden çıkarır. float(100) kullanmak alan eksikse güvenli bir varsayılan değer sağlar; böylece hatalı biçimlendirilmiş bir mesaj hata oluşturmaz. mode: queued, birkaç tarhtan aynı anda gelen uyarıların hepsinin işlenmesini garanti eder. Bu tür mesajlar yayınlayan toprak sensörleri için toprak nem sensörü MQTT eğitimine bakın.

Otomasyonlardan MQTT Yayınlama

mqtt.publish eylemi herhangi bir payload'ı herhangi bir topic'e gönderir. Burada zamana dayalı bir otomasyon bir vana denetleyicisine sulama komutu gönderiyor, bir durum değişikliği ise bir durum özeti yayınlıyor:

alias: Morning watering command
triggers:
  - trigger: time
    at: "06:30:00"
conditions:
  - condition: numeric_state
    entity_id: sensor.rain_last_24h
    below: 2
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/garden/valve/zone1/set
      payload: '{"state":"open","duration_s":600}'
      qos: 1
      retain: false
mode: single
alias: Publish alarm state for other systems
triggers:
  - trigger: state
    entity_id: alarm_control_panel.home
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/home/alarm/state
      payload: "{{ trigger.to_state.state }}"
      retain: true

İki temel kural vardır. Komutlar normalde retained olmamalıdır; aksi halde yarın yeniden bağlanan bir cihaz dünün komutunu tekrar çalıştırır. Diğer sistemlerin başlangıçta okuduğu durumlar ise retained olmalıdır; böylece yeni bir abone mevcut değeri hemen alır. Bu tür komutlar için QoS 1 ek gidiş dönüşe değer, çünkü kaybolan bir mesaj kuru kalan bir tarh demektir.

İstek ve Onay Kalıbı

Su, ısı veya kapı hareket ettiren her şey için yayınlanan bir komutun başarılı olduğunu varsaymayın. Cihazın onaylamasını bekleyin:

alias: Open zone 1 and verify
triggers:
  - trigger: state
    entity_id: input_boolean.water_zone1
    to: "on"
actions:
  - action: mqtt.publish
    data:
      topic: connectmq/demo/k9p4z7/garden/valve/zone1/set
      payload: open
  - wait_for_trigger:
      - trigger: mqtt
        topic: connectmq/demo/k9p4z7/garden/valve/zone1/state
        payload: open
    timeout: "00:00:15"
    continue_on_timeout: true
  - if:
      - condition: template
        value_template: "{{ wait.trigger is none }}"
    then:
      - action: notify.mobile_app_phone
        data:
          message: "Valve zone 1 did not confirm within 15 seconds."
mode: restart

Zaman aşımı dolduğunda wait.trigger değeri none olur; otomasyon vananın hiç yanıt vermediğini böyle anlar.

Sık Yapılan Hatalar

  1. Otomasyon döngüleri. Aynı zamanda tetiklendiği bir topic'e yayın yapan bir otomasyon sonsuza kadar çalışır. Command topic'lerini (/set) ve state topic'lerini (/state) ayrı tutun.
  2. Tetikleyicileri çalıştıran retained mesajlar. Home Assistant yeniden başlayıp yeniden abone olduğunda retained mesajlar tekrar iletilir ve MQTT tetikleyicileri çalışır. Bu istenmiyorsa {{ not trigger.retain }} gibi bir koşul ekleyin.
  3. Büyük/küçük harf ve boşluklar. payload: ON, on veya ON\n ile eşleşmez. value_template: "{{ value | trim | lower }}" ile normalleştirin.
  4. Yanlış wildcard. # yalnızca son seviye olarak geçerlidir; + tam olarak bir seviyeyle eşleşir.
  5. Sessiz şablon hataları. Settings > System > Logs bölümünü ve otomasyon izini (trace) kontrol edin; izler tetikleyici payload'ını gösterir ve hata ayıklamanın en hızlı yoludur.

Canlı Topic Görünümüyle Hata Ayıklama

Otomasyonu suçlamadan önce mesajın gerçekten geldiğini doğrulayın. Settings > Devices & services > MQTT > Configure bölümünde herhangi bir topic'e abone olan bir dinleme aracı vardır. Home Assistant dışında, bir masaüstü MQTT gezgini veya broker'ın web istemcisi aynı trafiği gösterir. Broker tarafını izlemek faydalıdır, çünkü sorunun cihazda mı, broker bağlantısında mı yoksa otomasyonda mı olduğunu söyler.

Otomasyonları Broker Tarafı Uyarılarla Birleştirme

Home Assistant otomasyonları yalnızca Home Assistant çalışırken çalışır. Onu barındıran Raspberry Pi'nin elektriği kesilirse, seranın aşırı ısındığından kimse haberdar olmaz. Kullanışlı bir güvenlik ağı, broker'da ikinci ve bağımsız bir uyarı yoludur. ConnectMQ portalında bir topic üzerinde eşik uyarı kuralları tanımlayabilir (örneğin 35'in üzerindeki bir sıcaklık) ve ev sunucunuz kapalıyken bile tetiklenen uyarıları uyarı günlüğünde görebilirsiniz. Akıllı mantığı Home Assistant'ta tutun ve broker tarafı kuralları yalnızca birkaç kritik sınır için kullanın.

Aynı mantık cihaz tarafı için de geçerlidir. Bir vana denetleyicisi, kapatma komutu hiç gelmese bile maksimum çalışma süresinden sonra kendini kapatmalıdır; çünkü open yayınlayıp ardından çöken bir otomasyon bahçeyi su basmasına yol açmamalıdır.

Üretime Geçiş

Su veya ısıyı kontrol eden otomasyonlar, herkesin topic'lerinize yayın yapabildiği herkese açık bir test alanına bağlı olmamalıdır. Özel bir broker oluşturun, MQTT entegrasyonunu kimlik bilgileriyle 8883 portuna geçirin ve topic öneklerini connectmq/demo/... yerine home/ veya site1/ gibi kendinize ait öneklerle değiştirin. Yönetilen bir MQTT broker'ı ayrıca uzak sensörlerin, bir yazlığın veya ikinci bir Home Assistant örneğinin modeminizde port açmadan aynı topic'lere yayın yapmasını sağlar. Cihazlar, broker ve mantıktan oluşan daha geniş mimari için IoT otomasyon rehberini okuyun.

Home Assistant'ı ConnectMQ ile Otomatikleştirin

ConnectMQ; TLS'li özel bir MQTT broker'ı, üretilmiş kimlik bilgileri, canlı bir topic gezgini ve tarayıcı içi bir MQTT istemcisi sunar; böylece tarayıcıdan çıkmadan otomasyonlarınıza test mesajları gönderebilirsiniz. app.connectmq.com adresinde kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun ve Home Assistant MQTT entegrasyonunu ona yönlendirin.

Sık Sorulan Sorular

Home Assistant MQTT tetikleyicisi wildcard kullanabilir mi?

Evet. Tetikleyici topic'inde hem + hem de # çalışır ve trigger.topic hangi somut topic'in eşleştiğini söyler.

Bir MQTT tetikleyicisinden JSON alanını nasıl okurum?

Şablonlarda trigger.payload_json.field kullanın ya da o alana göre filtrelemek için tetikleyicinin kendisinde value_template: "{{ value_json.field }}" kullanın.

Otomasyonum neden Home Assistant yeniden başladığında çalışıyor?

Retained mesajlar yeniden abone olunduğunda tekrar iletilir. Bir koşulda trigger.retain değerini kontrol edin ya da gerçekten bir olaysa o topic'i retain bayrağıyla yayınlamayı bırakın.

mqtt.publish komutları retained olmalı mı?

Genellikle hayır. Retained komutlar cihazlar yeniden bağlandığında onlara tekrar iletilir; bu da çok sonra bir vananın açılmasına veya bir rölenin çekmesine yol açabilir.

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