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
- 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. - 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. - Büyük/küçük harf ve boşluklar.
payload: ON,onveyaON\nile eşleşmez.value_template: "{{ value | trim | lower }}"ile normalleştirin. - Yanlış wildcard.
#yalnızca son seviye olarak geçerlidir;+tam olarak bir seviyeyle eşleşir. - 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.



