Uygulamalı Eğitimler

openHAB MQTT Binding Rehberi: Broker, Thing'ler ve Kanallar

openHAB MQTT binding kurulumu: broker Thing ekleyin, Generic MQTT Thing ve kanallar oluşturun, JSON ayrıştırın, Item bağlayın, kurallardan yayın yapın ve test edin.

Güncellendi · 8 dk okuma

openHAB MQTT Binding Rehberi: Broker, Thing'ler ve Kanallar

openHAB MQTT binding, openHAB'yi herhangi bir MQTT broker'a iki katmanda bağlar: bağlantıyı tutan bir broker Thing (host, port, TLS ve kimlik bilgilerini içeren bir bridge) ve onun altında, kanalları tek tek topic'leri openHAB Item'larına eşleyen bir veya daha fazla Generic MQTT Thing. Binding'i kurun, broker'ı ekleyin, her değer için bir kanalı olan bir Thing oluşturun, Item'ları bağlayın; bu topic'lerdeki her mesaj Item'larınızı günceller, arayüzden veya kurallardan gelen komutlar da geri yayınlanır.

Bu eğitim hem arayüz hem de metin dosyası yapılandırmasını adım adım anlatıyor, JSON payload'ların nasıl ayrıştırılacağını ve her adımın komut satırından nasıl doğrulanacağını gösteriyor.

Ön koşullar

  • MQTT Binding kurulu openHAB 4.x veya üstü (Settings → Add-on Store → Bindings → MQTT).
  • Cihazlarınız JSON gönderiyorsa (çoğu gönderir) JSONPath Transformation eklentisi.
  • Bir broker. openHAB broker içermez; Mosquitto'yu yerelde çalıştırın veya barındırılan bir broker kullanın. Örnekler 8883 portunda TLS ile broker.connectmq.com ve testmqtt/openhab/... altındaki test topic'lerini kullanıyor.

Adım 1: broker bridge Thing'i

Arayüzde Settings → Things → + → MQTT Binding → MQTT Broker yolunu izleyin ve şunları doldurun:

ParametreDeğerNotlar
Broker Hostname/IPbroker.connectmq.commqtt:// öneki olmadan
Broker Port8883TLS olmadan 1883
Secure ConnectionaçıkPortla eşleşmeli
ProtocolTCPWebSockets de mevcut
MQTT VersionV5V3, 3.1.1 anlamına gelir
Client IDopenhab-homeBroker üzerinde benzersiz
Username / Passwordbroker kimlik bilgileriniz
Keep Alive60Saniye

Broker'ınız otomatik yenilenen genel bir sertifika kullanıyorsa sertifika ve public key pinning'i kapalı bırakın: pinning gördüğü ilk sertifikayı saklar ve broker sertifikayı değiştirdiğinde başarısız olur. TLS tarafında sorun gidermeniz gerekirse bkz. TLS bağlantısını test etme.

Broker Thing birkaç saniye içinde ONLINE olmalıdır. OFFLINE - COMMUNICATION_ERROR gösteriyorsa, durum ayrıntısında nedeni yazar; genellikle port/TLS uyumsuzluğu veya yanlış kimlik bilgileridir.

Ayrıca bir Last Will (lwtTopic, lwtMessage) ile birth ve shutdown mesajları yapılandırabilirsiniz; böylece diğer sistemler openHAB'nin bağlı olup olmadığını bilir. Bir dashboard veya Node-RED buna bağlıysa kullanışlıdır.

Adım 2: bir Generic MQTT Thing ve kanalları

Bir Generic MQTT Thing ekleyin, bridge olarak broker'ı seçin ve Channels sekmesinden kanal ekleyin. Her kanalın bir türü ve en azından bir state topic'i vardır:

Kanal türüItem türüTipik payload'lar
Text value (string)StringHerhangi bir metin
Number value (number)Number (birimli)21.5
Percentage value (dimmer)Dimmer0–100
On/Off switch (switch)SwitchON/OFF (ayarlanabilir)
Open/Close contact (contact)ContactOPEN/CLOSED
Color value (color)Colorr,g,b veya h,s,b
Rollershutter (rollershutter)RollershutterUP/DOWN/STOP, yüzde
Date/Time, Location, ImageDateTime, Location, ImageISO tarih, lat,lon, ikili veri
Trigger (trigger)— (yalnızca kurallar)Buton olayları

Önemli kanal parametreleri:

  • State Topic: openHAB buraya abone olur ve Item'ı günceller.
  • Command Topic: Item bir komut aldığında openHAB buraya yayınlar. State topic'ten farklı bir topic kullanın (ör. .../set); aksi halde kendi komutlarınız durum güncellemesi olarak geri gelir.
  • Incoming Value Transformations: örneğin JSONPATH:$.temperature.
  • Outgoing Value Format: komutları JSON'a sarmak için %s veya {"state":"%s"} gibi bir format dizesi.
  • Retained: komutları retained mesaj olarak yayınlar; açmadan önce retained mesajlar yazısını okuyun.
  • Custom On/Open Value ve Custom Off/Closed Value: 1/0 veya true/false gibi cihaz payload'larını eşler.
  • Is Command (postCommand): gelen değerleri durum güncellemesi yerine komut olarak ele alır; böylece diğer binding'leri ve kuralları tetiklerler.

Aynı yapılandırma metin dosyalarıyla

Sürüm kontrolü için broker'ı ve Thing'leri bir .things dosyasında tanımlayın:

conf/things/mqtt.things
Bridge mqtt:broker:connectmq "ConnectMQ broker" [
    host="broker.connectmq.com", port=8883, secure=true,
    certificatepin=false, publickeypin=false,
    protocol="TCP", mqttVersion="V5",
    clientID="openhab-home", username="username", password="password",
    keepAlive=60, qos=1
] {
    Thing topic livingroom "Living room" [
        availabilityTopic="testmqtt/openhab/livingroom/status",
        payloadAvailable="online", payloadNotAvailable="offline"
    ] {
        Channels:
            Type number : temperature "Temperature" [
                stateTopic="testmqtt/openhab/livingroom/sensor",
                transformationPattern="JSONPATH:$.temperature", unit="°C" ]
            Type number : humidity "Humidity" [
                stateTopic="testmqtt/openhab/livingroom/sensor",
                transformationPattern="JSONPATH:$.humidity", unit="%" ]
            Type switch : lamp "Lamp" [
                stateTopic="testmqtt/openhab/livingroom/lamp/state",
                commandTopic="testmqtt/openhab/livingroom/lamp/set",
                on="ON", off="OFF" ]
            Type trigger : button "Wall button" [
                stateTopic="testmqtt/openhab/livingroom/button" ]
    }
}

Kanal UID'si mqtt:topic:connectmq:livingroom:<kanal> şeklindedir. Item'ları buna bağlayın:

conf/items/livingroom.items
Number:Temperature   LivingRoom_Temperature "Temperature [%.1f %unit%]" { channel="mqtt:topic:connectmq:livingroom:temperature" }
Number:Dimensionless LivingRoom_Humidity    "Humidity [%.0f %%]"        { channel="mqtt:topic:connectmq:livingroom:humidity" }
Switch               LivingRoom_Lamp        "Lamp"                      { channel="mqtt:topic:connectmq:livingroom:lamp" }

İki kanal tek bir state topic'i paylaşıyor ve farklı JSON alanlarını çıkarıyor; çoklu sensörlü cihazlar için olağan desen budur. availabilityTopic, cihazın Last Will mesajı tetiklendiğinde Thing'i OFFLINE olarak işaretler.

Kurallardan yayın yapma

Broker Thing, bildirimler veya Thing'i olmayan cihazlarla konuşmak için kullanışlı bir publishMQTT aksiyonu sunar:

conf/rules/mqtt.rules
rule "Publish lamp changes as an event"
when
    Item LivingRoom_Lamp changed
then
    val mqtt = getActions("mqtt", "mqtt:broker:connectmq")
    mqtt.publishMQTT("testmqtt/openhab/events/lamp", newState.toString, false)
end

rule "Wall button pressed"
when
    Channel "mqtt:topic:connectmq:livingroom:button" triggered
then
    LivingRoom_Lamp.sendCommand(if (LivingRoom_Lamp.state == ON) OFF else ON)
end

Genel dinleyiciler için broker Thing'in kendisine bir Publish trigger kanalı ekleyin: state topic'i wildcard kabul eder (testmqtt/openhab/+/event) ve kurallar olay olarak topic#payload alır.

Her adımı test edin

Gelen yön: sahte bir sensör ölçümü yayınlayın ve Item'ların değiştiğini izleyin:

Sensörü simüle edin
mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" \
  -t 'testmqtt/openhab/livingroom/sensor' -m '{"temperature": 21.5, "humidity": 48}'

mosquitto_pub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" \
  -t 'testmqtt/openhab/livingroom/status' -m online -r

events.log (Linux paketlerinde /var/log/openhab/events.log) Item 'LivingRoom_Temperature' changed from NULL to 21.5 °C satırını göstermelidir.

Giden yön: command topic'e abone olun ve switch'i arayüzden veya openHAB konsolundan değiştirin:

openHAB'den gelen komutları izleyin
mosquitto_sub -h broker.connectmq.com -p 8883 --capath /etc/ssl/certs \
  -u "$MQTT_USER" -P "$MQTT_PASS" -t 'testmqtt/openhab/#' -v

# başka bir shell'de: openhab-cli console, ardından
openhab> openhab:send LivingRoom_Lamp ON

testmqtt/openhab/livingroom/lamp/set ON görmelisiniz. Tarayıcıyı tercih ediyorsanız online MQTT istemcisi iki yön için de aynı şekilde çalışır.

openHAB'nin MQTT trafiğini tarayıcıda izleyin

Hiçbir şey olmuyorsa, konsolda log:set DEBUG org.openhab.binding.mqtt ve log:set DEBUG org.openhab.core.io.transport.mqtt ile log seviyesini yükseltin. Tipik bulgular: Item farklı bir kanal UID'sine bağlı, JSONPath eşleşmiyor (değer NULL kalır ve bir dönüşüm uyarısı loglanır) ya da topic bir karakter farklı; kontrol etmek için ikisini de topic matcher aracına yapıştırın.

Otomatik keşif: Homie ve Home Assistant

Binding iki keşif kuralını da anlar. Kendini Homie kuralıyla veya Home Assistant MQTT discovery ile duyuran cihazlar (Tasmota, ESPHome, discovery açık Zigbee2MQTT) openHAB Inbox'ında kanalları hazır olarak görünür. Bu yazma işini azaltır; ancak topic adları üzerinde tam kontrol istediğinizde özel firmware'ler ve Shelly veya Zigbee2MQTT gibi cihazlar için Generic Thing'ler en öngörülebilir seçenek olmaya devam eder. Hangisini seçerseniz seçin, tutarlı bir akıllı ev topic tasarımı kanal yapılandırmasını kısa tutar.

İki katman yerine oturduğunda openHAB MQTT binding basittir: bağlantı başına bir broker Thing, değer başına bir kanalı olan Generic MQTT Thing'ler ve kanallara bağlı Item'lar. Tek bir kanalla başlayın, mosquitto_pub ve events.log ile doğrulayın, ardından evin geri kalanını ekleyin.

Sıkça sorulan sorular

openHAB bir MQTT broker içeriyor mu?

Hayır. Güncel openHAB sürümleri yalnızca bir istemci olan MQTT binding'i içerir. Aynı makinede Mosquitto gibi ayrı bir broker'a veya ağ üzerinden erişilebilen yönetilen bir broker'a ihtiyacınız var.

openHAB MQTT broker Thing'im neden OFFLINE?

Durum ayrıntısı genellikle nedenini söyler: yanlış host veya port, şifresiz bir portta TLS açık olması (ya da tersi), hatalı kimlik bilgileri veya zaten kullanılan bir client ID. Kesin hatayı görmek için org.openhab.binding.mqtt ve org.openhab.core.io.transport.mqtt için DEBUG log'u açın.

openHAB'de bir JSON payload'dan tek bir değeri nasıl okurum?

JSONPath Transformation eklentisini kurun ve kanalın gelen dönüşümünü JSONPATH:$.temperature (veya ihtiyacınız olan yol) olarak ayarlayın. Birden fazla kanal aynı state topic'i paylaşıp her biri farklı bir alanı çıkarabilir.