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
- Köprü OFFLINE kalıyor. Host ve portu kontrol edin;
secure=trueyalnızca 8883 portuyla birlikte ayarlanmalıdır. Neden kodu içinopenhab.logdosyasına bakın. - 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.
- 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.mqttkullanın. - Anahtar UNDEF gösteriyor. Payload
onveyaoffdeğeriyle birebir eşleşmiyor; değerler büyük/küçük harfe duyarlıdır. - 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.



