IoT Otomasyon

openHAB MQTT Binding Eğitimi: Broker Köprüsü, Generic Thing'ler ve Kurallar

openHAB'ı harici bir MQTT broker'ına bağlayın, sensörleri ve anahtarları generic MQTT thing olarak modelleyin, JSON payload'larını ayrıştırın ve kurallardan yayın yapın; üretime hazır bir TLS kurulumuyla.

Bir broker köprü thing'ini bulut MQTT broker'ı üzerinden sensörlere ve anahtarlara bağlayan openHAB MQTT binding
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

openHAB MQTT binding, herhangi bir MQTT topic'ini item'lara bağlayabileceğiniz, panellerde gösterebileceğiniz ve kurallarda kullanabileceğiniz kanallara dönüştürür. Bu eğitimde openHAB'ı harici bir broker'a bağlayacak, bir sensör ve bir anahtar için generic MQTT thing'ler tanımlayacak, JSON payload'larını ayrıştıracak, kurallardan komut yayınlayacak ve kurulumu TLS ile kimlik bilgileriyle sağlamlaştıracaksınız.

openHAB MQTT Binding Nasıl Düzenlenir?

openHAB, MQTT'yi iki katmanda modeller. Broker köprüsü (mqtt:broker) bağlantının kendisidir: host, port, TLS, client ID ve kimlik bilgileri. Altında, her biri bir cihazı topic'leriyle tanımlayan thing'ler bulunur. En esnek thing türü generic MQTT thing'dir (mqtt:topic); burada her kanalı ve kullandığı state ve command topic'lerini siz bildirirsiniz. Ardından item'lar bu kanallara, diğer tüm binding'lerde olduğu gibi bağlanır.

Katman Thing türü İçerdikleri
Bağlantı mqtt:broker (bridge) Host, port, TLS, client ID, kullanıcı adı, parola, last will
Cihaz mqtt:topic (generic thing) State ve command topic'leri olan kanallar
Cihaz (otomatik) Home Assistant veya Homie thing'leri Discovery mesajlarından oluşturulur
Model Item'lar Kanallara bağlanır, arayüzde ve kurallarda kullanılır

Tek bir broker köprüsü yüzlerce thing'e hizmet verebilir ve yalnızca bir MQTT bağlantısı kullanır. Bu, bağlantı kotası olan planlarda önemlidir: openHAB, kaç cihaz modellerse modellesin tek bir istemci olarak sayılır.

Binding'i Settings > Add-on Store > Bindings > MQTT Binding yolundan kurun. Cihazlarınız JSON gönderiyorsa, dönüşümler bölümünden JSONPath Transformation eklentisini de kurun.

openHAB'ı Bir MQTT Broker'ına Bağlama

Köprüyü arayüzde (Things > + > MQTT Binding > MQTT Broker) veya bir .things dosyasında oluşturabilirsiniz. Metin yapılandırmasını paylaşmak ve yedeklemek daha kolay olduğundan bu eğitim onu kullanıyor. conf/things/mqtt.things dosyasını oluşturun:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [
    host="broker.connectmq.com",
    port=1883,
    secure=false,
    clientID="openhab-r4t8w1",
    lwtTopic="connectmq/demo/r4t8w1/openhab/status",
    lwtMessage="offline",
    lwtRetain=true,
    birthTopic="connectmq/demo/r4t8w1/openhab/status",
    birthMessage="online",
    birthRetain=true
] {
    Thing topic greenhouse "Greenhouse Sensor" {
    Channels:
        Type number : temperature "Temperature" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/telemetry",
            transformationPattern="JSONPATH:$.temp",
            unit="°C"
        ]
        Type number : humidity "Humidity" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/telemetry",
            transformationPattern="JSONPATH:$.hum",
            unit="%"
        ]
        Type switch : fan "Vent Fan" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/fan/state",
            commandTopic="connectmq/demo/r4t8w1/greenhouse/fan/set",
            on="ON",
            off="OFF"
        ]
        Type contact : door "Door" [
            stateTopic="connectmq/demo/r4t8w1/greenhouse/door",
            on="OPEN",
            off="CLOSED"
        ]
    }
}

Bu, herkese açık test broker'ına anonim olarak bağlanır. Herkese açık alan paylaşımlı olduğu ve herkes tarafından okunabildiği için r4t8w1 değerini kendi rastgele dizenizle değiştirin. Client ID boş olmamalı ve benzersiz olmalıdır; başka bir istemcinin kullandığı bir ID'yi yeniden kullanmak iki bağlantının da sürekli kopmasına yol açar.

Settings > Things bölümünü kontrol edin: köprü birkaç saniye içinde ONLINE olmalı, ardından greenhouse thing'i gelmelidir.

Item'ları bağlama

conf/items/greenhouse.items dosyasını oluşturun:

Number:Temperature GH_Temperature "Temperature [%.1f °C]" <temperature> { channel="mqtt:topic:connectmq:greenhouse:temperature" }
Number:Dimensionless GH_Humidity "Humidity [%.0f %%]" <humidity> { channel="mqtt:topic:connectmq:greenhouse:humidity" }
Switch GH_Fan "Vent Fan" <fan> { channel="mqtt:topic:connectmq:greenhouse:fan" }
Contact GH_Door "Door [%s]" <door> { channel="mqtt:topic:connectmq:greenhouse:door" }

Kanal UID kalıbına dikkat edin: mqtt:topic:<bridge id>:<thing id>:<channel id>. Buradaki bir yazım hatası, bir item'ın NULL kalmasının en yaygın nedenidir.

openHAB MQTT Kanallarını Test Etme

Cihazı bir terminalden simüle edin:

# sensör okuması (JSON, JSONPath ile ayrıştırılır)
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/telemetry' -m '{"temp":24.6,"hum":71}'

# kapı kontağı
mosquitto_pub -h broker.connectmq.com -p 1883 -i sim-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/door' -m 'OPEN'

# openHAB'ın gönderdiği komutları izle
mosquitto_sub -h broker.connectmq.com -p 1883 -i mon-r4t8w1 \
  -t 'connectmq/demo/r4t8w1/greenhouse/fan/set' -v

openHAB arayüzünde fanı açıp kapattığınızda ON veya OFF komutu abone penceresinde görünür. Gerçek bir cihaz buna göre hareket eder ve yeni durumunu fan/state topic'ine yayınlar; openHAB da item'ı güncellemek için bunu kullanır. Command ve state topic'lerini ayrı tutmak, arayüzün yalnızca son tıklamayı değil, onaylanmış durumu göstermesini sağlar.

JSON Ayrıştırma ve Komutları Biçimlendirme

Çoğu modern cihaz JSON yayınlar. Generic thing, gelen değerler için transformationPattern'ın yanı sıra giden değerler için formatBeforePublish desteği de sunar. Örneğin {"brightness": 40} bekleyen bir dimmer:

Type dimmer : lamp "Grow Lamp" [
    stateTopic="connectmq/demo/r4t8w1/greenhouse/lamp/state",
    commandTopic="connectmq/demo/r4t8w1/greenhouse/lamp/set",
    transformationPattern="JSONPATH:$.brightness",
    formatBeforePublish="{\"brightness\": %s}",
    min=0,
    max=100
]

Birden fazla adıma ihtiyacınız varsa, dönüşümler kalıp içinde ∩ karakteriyle zincirlenebilir; örneğin JSONPath ardından bir MAP araması. Zincirleri kısa tutun; mantık büyüdüğünde bir kuralda hata ayıklamak daha kolaydır.

openHAB Kurallarından MQTT Mesajları Yayınlama

Kanallara bağlı komutlar çoğu ihtiyacı karşılar, ancak bazen rastgele bir topic'e yayın yapmak istersiniz; örneğin bir denetleyiciye zamanlama göndermek için. Broker köprüsü bunun için bir publishMQTT eylemi sunar. conf/rules/greenhouse.rules adlı bir DSL kural dosyasında:

rule "Greenhouse overheat"
when
    Item GH_Temperature changed
then
    val temp = (GH_Temperature.state as QuantityType<Number>).toUnit("°C").doubleValue
    if (temp > 30.0 && GH_Fan.state != ON) {
        GH_Fan.sendCommand(ON)
        val mqtt = getActions("mqtt", "mqtt:broker:connectmq")
        mqtt.publishMQTT("connectmq/demo/r4t8w1/greenhouse/event",
            "{\"event\":\"overheat\",\"temp\":" + temp + "}", false)
    }
end

Aynı eylem JavaScript kurallarında actions.get("mqtt", "mqtt:broker:connectmq") ile kullanılabilir. Bilerek bir döngü oluşturmak istemiyorsanız, bir kanalın abone olduğu topic'e yayın yapmaktan kaçının.

Ham topic'lerden kural tetikleme

Bir item modellemeden yalnızca bir mesaja tepki vermek istiyorsanız, köprüye bir tetikleyici kanal ekleyin:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [ ... ] {
    Channels:
        Type publishTrigger : alarms "Alarms" [
            stateTopic="connectmq/demo/r4t8w1/+/alarm",
            separator="#"
        ]
}

Channel "mqtt:broker:connectmq:alarms" triggered ile tetiklenen bir kural, ayırıcıyla birleştirilmiş topic'i ve payload'ı alır; böylece tek bir kural tüm cihazlardan gelen alarmları işleyebilir.

TLS ve Kimlik Bilgileriyle Üretim Kurulumu

Gerçek cihazları bağlamadan önce herkese açık test alanından çıkın. Özel bir broker oluşturun, ardından köprüyü güncelleyin:

Bridge mqtt:broker:connectmq "ConnectMQ Broker" [
    host="broker.connectmq.com",
    port=8883,
    secure=true,
    certificatepin=false,
    publickeypin=false,
    clientID="YOUR_CLIENT_ID",
    username="YOUR_USERNAME",
    password="YOUR_PASSWORD",
    lwtTopic="site1/openhab/status",
    lwtMessage="offline",
    lwtRetain=true
]

ConnectMQ'nun sertifikası, Java'nın varsayılan olarak güvendiği Let's Encrypt tarafından verilir; bu nedenle ek sertifika içe aktarmaya gerek yoktur. Let's Encrypt sertifikaları birkaç ayda bir yenilendiği için sertifika sabitleme (pinning) açıkça kapatılmıştır; sabitlenmiş bir sertifika, bir sonraki yenilemeden sonra köprünün broker'ı reddetmesine neden olur. Kimlik bilgilerine bağlı olduğu için client ID'yi tam olarak verildiği gibi kullanın. Tüm sistemi sıkılaştırma hakkında daha fazlası için MQTT güvenliği en iyi uygulamaları yazısını okuyun.

Broker'ınızı openHAB'ın ağı içinde yerel olarak çalıştırmayı tercih ederseniz, onu daha sonra yine buluta köprüleyebilirsiniz; ancak tam yönetilen bir MQTT hizmeti ayrı bir broker sunucusunun bakımını gereksiz kılar ve uzak konumların ve telefonların aynı topic'lere ulaşmasını sağlar.

Cihaz Erişilebilirliğini Gösterme

Generic thing, köprü bağlı olduğu sürece ONLINE kalır; arkasındaki cihazın gücü saatler önce kesilmiş olsa bile. Bunu görünür kılmak için her cihazın bağlandığında retained bir online mesajı yayınlamasını ve retained bir offline last will ayarlamasını sağlayın. Ardından thing'e erişilebilirlik ayarları ekleyin:

Thing topic greenhouse "Greenhouse Sensor" [
    availabilityTopic="connectmq/demo/r4t8w1/greenhouse/status",
    payloadAvailable="online",
    payloadNotAvailable="offline"
] {
    // kanallar önceki gibi
}

Cihaz düştüğünde broker onun will mesajını yayınlar, openHAB thing'i OFFLINE olarak işaretler ve bağlı item'lar UNDEF olur. Kurallar ve paneller böylece "sensör 0 okuyor" ile "sensör yok" durumlarını ayırt edebilir; bu da ısıtma, sulama veya alarm süren her şey için büyük önem taşır.

Sorun Giderme Kontrol Listesi

  1. Köprü OFFLINE kalıyor. Host ve portu kontrol edin; secure=true yalnızca 8883 portuyla birlikte ayarlanmalıdır. Neden kodu için openhab.log dosyasına bakın.
  2. Köprü ONLINE ile OFFLINE arasında gidip geliyor. Yinelenen client ID; başka bir openHAB örneği veya test aracı aynı ID'yi kullanıyor.
  3. Thing ONLINE ama item NULL. Item'da yanlış kanal UID'si, bir topic yazım hatası veya eksik JSONPath eklentisi. Alınan her mesajı görmek için konsolda log:set DEBUG org.openhab.binding.mqtt kullanın.
  4. Anahtar UNDEF gösteriyor. Payload on veya off değeriyle birebir eşleşmiyor; değerler büyük/küçük harfe duyarlıdır.
  5. Komutlar hiçbir şey yapmıyor. Cihazın command topic'ini dinlediğinden ve onun state topic'ine yayın yapmadığınızdan emin olun.

openHAB'ın Daha Geniş Bir Sistemdeki Yeri

openHAB broker üzerindeki tüketicilerden biridir, verinin sahibi değildir. ESPHome düğümleri, Tasmota prizleri ve Zigbee2MQTT aynı broker'a yayın yapabilir ve diğer araçlar aynı topic'leri okuyabilir. ESPHome MQTT eğitimi YAML ile yapılandırılmış cihazlardan nasıl yayın yapılacağını gösterir, Tasmota MQTT ise firmware'i değiştirilmiş akıllı prizleri ele alır. Daha geniş mimari resim için IoT otomasyon rehberine bakın. Hâlâ broker'ları karşılaştırıyorsanız, bulut MQTT broker'ı genel bakışı ödünleşimleri açıklar.

openHAB'ı ConnectMQ Broker'ında Çalıştırın

ConnectMQ, TLS'li özel bir MQTT 3.1.1 ve 5.0 broker'ı, üretilmiş kimlik bilgileri ve openHAB kanallarında hata ayıklamayı kolaylaştıran canlı bir topic gezgini sunar. app.connectmq.com adresinde kredi kartı olmadan ücretsiz bir Serverless broker oluşturun, kimlik bilgilerini köprünüze yapıştırın ve openHAB thing'leriniz çevrimiçi olsun.

Sık Sorulan Sorular

openHAB kendi MQTT broker'ını içerir mi?

Hayır. Güncel openHAB sürümleri yalnızca istemci binding'ini sağlar; bu nedenle yerel bir Mosquitto örneği veya ConnectMQ gibi bir bulut broker'ı gibi harici bir broker'a ihtiyacınız vardır.

openHAB MQTT 5 kullanabilir mi?

Broker köprüsünün V5 olarak ayarlanabilen bir mqttVersion parametresi vardır. Varsayılan olarak 3.1.1 kalır ve neredeyse tüm cihazlarla çalışır.

openHAB kaç MQTT bağlantısı kullanır?

Altında kaç generic thing olursa olsun, broker köprüsü başına bir bağlantı. Bu, bağlantı sınırlı planlarda onu verimli kılar.

Item'larım güncelleniyor ama komutlar neden gönderilmiyor?

Kanalda muhtemelen commandTopic yoktur ya da item salt okunur bağlanmıştır. Bir command topic ekleyin ve mesajın yayınlandığını bir aboneyle doğrulayın.

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