Shelly MQTT desteği, Shelly röle, priz ve enerji ölçerlerini herhangi bir MQTT aracının izleyip kontrol edebileceği, yerel öncelikli cihazlara dönüştürür. Bu rehberde Gen2 ve Gen3 Shelly cihazlarda (Plus, Pro, Mini ve Gen3 aileleri) MQTT'yi etkinleştirecek, yayınladıkları topic'leri öğrenecek, çıkışları düz komutlar ve JSON-RPC ile kontrol edecek ve cihazları TLS üzerinden bir broker'a bağlayacaksınız. Tüm örnekler önce ücretsiz public test broker'ında çalışır.
Shelly MQTT, Gen2 ve Gen3'te Nasıl Çalışır?
Shelly'nin ikinci nesil firmware'i, eski Gen1 topic düzenini (shellies/<id>/relay/0) JSON-RPC 2.0 üzerine kurulu bir API ile değiştirdi. HTTP veya WebSocket üzerinden çağırabildiğiniz aynı RPC metotları MQTT üzerinden de kullanılabilir ve durum değişiklikleri bildirim olarak yayınlanır. Gen3 cihazlar aynı API'yi kullanır, dolayısıyla aşağıdaki her şey ikisi için de geçerlidir.
Her cihazın varsayılan olarak cihaz kimliği olan bir topic öneki vardır; örneğin shellyplus1pm-a8032ab12345. Bunu topic ağacınıza uyan herhangi bir şeyle değiştirebilirsiniz. Bu önek altındaki önemli topic'ler şunlardır:
| Topic | Yön | İçerik |
|---|---|---|
<prefix>/online |
Cihazdan broker'a (retained) | true veya false; false Last Will mesajıdır |
<prefix>/events/rpc |
Cihazdan broker'a | NotifyStatus ve NotifyEvent gibi JSON-RPC bildirimleri |
<prefix>/status/<component> |
Cihazdan broker'a | Genel durum güncellemeleri etkinse tam bileşen durumu, ör. status/switch:0 |
<prefix>/rpc |
Broker'dan cihaza | JSON-RPC istekleri |
<src>/rpc |
Cihazdan broker'a | RPC isteklerine yanıtlar, belirttiğiniz src adresine gönderilir |
<prefix>/command |
Broker'dan cihaza | status_update gibi basit komutlar |
<prefix>/command/switch:0 |
Broker'dan cihaza | Bir switch çıkışı için on, off veya toggle |
Cihazın ne yayınlayacağını iki ayar belirler. RPC status notifications, bir şey değiştiğinde events/rpc üzerinde kompakt NotifyStatus mesajları gönderir. Generic status update ise tam bileşen durumunu status/<component> topic'lerinde yayınlar. Çoğu entegrasyon için bileşen bazlı status topic'lerini işlemek daha kolaydır, çünkü her mesaj bir fark (delta) değil eksiksiz bir anlık görüntüdür.
Cihaz diğer tüm MQTT istemcileri gibi davranır: broker'a tek bir bağlantı açar, durumunu yayınlar ve kendi komut topic'lerine abone olur. Bu resimde bir MQTT broker'ın ne yaptığını hâlâ kafanızda oturtmaya çalışıyorsanız, kilit nokta şudur: Shelly asla dashboard'unuzla doğrudan konuşmaz; ikisi de broker ile konuşur. Bu yüzden tek bir cihaz, röleye ek yük bindirmeden aynı anda Home Assistant'ı, Node-RED'i ve bir Python betiğini besleyebilir.
Web Arayüzünde MQTT'yi Etkinleştirme
Cihazın IP adresinden yerel web arayüzünü açın ve Settings > MQTT bölümüne gidin (bazı firmware sürümlerinde Networks > MQTT altındadır). Şunları yapılandırın:
- MQTT'yi Enable ile etkinleştirin.
- Server: ilk test için
broker.connectmq.com:1883. - Client ID: varsayılanı bırakın veya
shelly-garage-1pmgibi benzersiz bir değer verin. - Username / Password: public test broker için boş.
- MQTT prefix: benzersiz bir değerle değiştirin, örneğin
connectmq/demo/r7t2/shelly/garage; çünkü public broker paylaşımlıdır ve herkes tarafından okunabilir. - RPC status notifications over MQTT ve Generic status update over MQTT seçeneklerini etkinleştirin.
- Komut göndermek istiyorsanız Enable "MQTT Control" seçeneğini açık bırakın.
- Kaydedin ve istendiğinde yeniden başlatın.
MQTT, cihazın yerel web arayüzü, HTTP API'si ve giden WebSocket seçenekleriyle yan yana çalışır; yani etkinleştirdiğinizde yerel kontrolü kaybetmezsiniz. Shelly bulut uygulamasını da kullanıyorsanız, MQTT'yi etkinleştirdikten sonra uygulamanın sizin firmware sürümünüzde cihazı hâlâ çevrimiçi gösterdiğini kontrol edin.
- adımdaki önek beş topic seviyesi kullanır ve Shelly iki seviye daha ekler (
status/switch:0); bu da sizi public broker'ın 8 seviye limitinin içinde tutar. Daha derin bir ağaç istiyorsanız öneki kısaltın.
Shelly MQTT'yi RPC API ile Yapılandırma
Çok sayıda cihaz için arayüzde tek tek tıklamak yavaştır. Aynı yapılandırmayı Mqtt.SetConfig metoduyla cihaz başına tek bir HTTP çağrısıyla uygulayıp ardından yeniden başlatabilirsiniz:
SHELLY=192.168.1.50
curl -s -X POST "http://$SHELLY/rpc" -d '{
"id": 1,
"method": "Mqtt.SetConfig",
"params": {
"config": {
"enable": true,
"server": "broker.connectmq.com:1883",
"client_id": "shelly-garage-1pm",
"user": null,
"pass": null,
"topic_prefix": "connectmq/demo/r7t2/shelly/garage",
"rpc_ntf": true,
"status_ntf": true,
"enable_control": true
}
}
}'
curl -s -X POST "http://$SHELLY/rpc" -d '{"id":2,"method":"Shelly.Reboot"}'
Sonucu curl -s "http://$SHELLY/rpc/Mqtt.GetStatus" ile kontrol edin; cihaz broker ile konuşmaya başladığında {"connected":true} döner. Cihaz parola korumalıysa curl çağrılarına --anyauth -u admin:YOUR_DEVICE_PASSWORD ekleyin.
Shelly MQTT Mesajlarını İzleme
Önekin tamamına abone olun ve röleyi elle veya uygulamadan açıp kapatın:
mosquitto_sub -h broker.connectmq.com -p 1883 -i shelly-watch-4410 \
-t "connectmq/demo/r7t2/shelly/garage/#" -v
Status topic'lerindeki her mesaj aynı zamanda topic önekiniz için iyi bir testtir: çıktıda ilgisiz cihazlar görüyorsanız public broker'da başka biri aynı öneki kullanıyordur ve daha rastgele bir önek seçmelisiniz.
Bir Shelly Plus 1PM, .../status/switch:0 üzerinde şuna benzer bir durum yayınlar:
{
"id": 0,
"source": "WS_in",
"output": true,
"apower": 1184.6,
"voltage": 229.8,
"current": 5.21,
"aenergy": { "total": 15832.417, "by_minute": [19542.1, 19688.3, 19601.8], "minute_ts": 1760592120 },
"temperature": { "tC": 47.3, "tF": 117.2 }
}
Burada birimler önemlidir: apower watt, voltage volt, current amper ve aenergy.total watt-saat cinsinden toplam ömür boyu enerjidir. by_minute değerleri, son üç tam dakika için miliwatt-saat cinsindendir. Düz bir Plus 1 gibi ölçüm yapmayan cihazlar güç alanlarını içermez.
Çıkışları Kontrol Etme
Bir çıkışı anahtarlamanın en basit yolu, düz metin kabul eden komut topic'idir:
mosquitto_pub -h broker.connectmq.com -p 1883 -i shelly-cmd-4411 \
-t "connectmq/demo/r7t2/shelly/garage/command/switch:0" -m "on"
off veya toggle komutlarını da aynı şekilde kullanın; cihazın tam durumunu hemen yayınlamasını sağlamak için <prefix>/command topic'ine status_update yayınlayın. Bu, bir dashboard yeniden başladıktan sonra çok işe yarar.
Açma ve kapamanın ötesindeki her şey için JSON-RPC kullanın. src alanı cihaza yanıtı nereye göndereceğini söyler: cihaz yanıtı <src>/rpc topic'ine yayınlar.
mosquitto_pub -h broker.connectmq.com -p 1883 -i shelly-cmd-4412 \
-t "connectmq/demo/r7t2/shelly/garage/rpc" \
-m '{"id":10,"src":"connectmq/demo/r7t2/client1","method":"Switch.Set","params":{"id":0,"on":true,"toggle_after":600}}'
Bu komut çıkışı açar ve on dakika sonra otomatik olarak yeniden kapatır; pompalar ve ısıtıcılar için güvenli bir kalıptır. "was_on" dahil yanıtı görmek için connectmq/demo/r7t2/client1/rpc topic'ine abone olun.
Bir Python Entegrasyonu
Aşağıdaki betik switch durumuna abone olur, güç ölçümlerini yazdırır ve yük bir limitin üzerinde güç çekerse onu kapatır; bu, cihazın dışında çalışan yerel bir koruma kuralına örnektir.
pip install "paho-mqtt>=2.0"
import json
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/r7t2/shelly/garage"
LIMIT_W = 2000
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(f"{PREFIX}/status/switch:0", qos=1)
client.subscribe(f"{PREFIX}/online", qos=1)
client.publish(f"{PREFIX}/command", "status_update")
def on_message(client, userdata, msg):
if msg.topic.endswith("/online"):
print("Device online:", msg.payload.decode())
return
status = json.loads(msg.payload)
power = status.get("apower", 0.0)
energy_kwh = status.get("aenergy", {}).get("total", 0.0) / 1000
print(f"output={status.get('output')} power={power:.1f} W total={energy_kwh:.3f} kWh")
if status.get("output") and power > LIMIT_W:
print("Over limit, switching off")
client.publish(f"{PREFIX}/command/switch:0", "off", qos=1)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="shelly-py-7781")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_forever()
Birden fazla priz için günlük enerji grafikleri için MQTT ile akıllı priz enerji izleme eğitimine, Shelly Pro 3EM veya CT pens ile tüm evin ölçümü için ev enerji izleme rehberine bakın.
Shelly Cihazlarını Güvenli Şekilde Bağlama
Public broker'lar test içindir; önekinizi bilen herkes cihazlarınızı okuyabilir, hatta açıp kapatabilir. Production için kimlik bilgileri ve TLS içeren özel bir broker kullanın. Shelly Gen2 ve Gen3, MQTT ayarlarındaki SSL/TLS seçeneğiyle TLS'i destekler ve üç seçenek sunar: TLS yok, dahili CA paketiyle TLS veya kullanıcının sağladığı CA ile TLS. RPC üzerinden bunu ssl_ca alanı belirler: "ca.pem" dahili paketi, "user_ca.pem" yüklediğiniz bir CA'yı kullanır, "*" ise TLS'i sertifika doğrulaması olmadan etkinleştirir (hızlı testler dışında bundan kaçının).
ConnectMQ, güncel firmware'lerde dahili paketin doğruladığı Let's Encrypt sertifikalarını kullanır. Production yapılandırması şöyle görünür:
{
"enable": true,
"server": "broker.connectmq.com:8883",
"client_id": "YOUR_CLIENT_ID",
"user": "YOUR_USERNAME",
"pass": "YOUR_PASSWORD",
"ssl_ca": "ca.pem",
"topic_prefix": "home/garage/shelly1pm",
"rpc_ntf": true,
"status_ntf": true,
"enable_control": true
}
ConnectMQ client ID'leri verilen kimlik bilgilerine bağladığı için her Shelly, tek bir oturum açma bilgisini cihazlar arasında paylaşmak yerine portaldan alınmış kendi kimlik bilgisi setini kullanmalıdır. Bir yönetilen MQTT broker, sırf rölelerinize dışarıdan erişebilmek için evdeki bir sunucuda Mosquitto çalıştırma ve yamalama zahmetinden de sizi kurtarır.
Sorun Giderme Kontrol Listesi
| Belirti | Olası neden | Çözüm |
|---|---|---|
Mqtt.GetStatus connected:false gösteriyor |
Yanlış host:port biçimi | mqtt:// olmadan host:port kullanın |
| Bağlanıyor, sonra sürekli kopuyor | Aynı client ID'ye sahip iki cihaz | Her cihaza benzersiz bir ID verin |
| TLS başarısız | Eski firmware veya yanlış CA seçeneği | Firmware'i güncelleyin, ca.pem kullanın |
status/switch:0 mesajı yok |
Generic status update kapalı | Etkinleştirin veya events/rpc kullanın |
| Komutlar yok sayılıyor | MQTT kontrolü kapalı | enable_control: true ayarlayın |
| Önek değiştikten sonra hiçbir şey gelmiyor | Cihaz yeniden başlatılmadı | Shelly.Reboot çağırın |
Shelly Cihazlarınızı ConnectMQ Üzerinde Çalıştırın
ConnectMQ, Shelly röle, priz ve sayaçlarınıza 8883 portunda TLS'li özel bir broker, cihaz başına oluşturulan kimlik bilgileri ve her durum güncellemesini izleyebileceğiniz canlı topic gezginine sahip bir portal sunar. app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun. Akıllı evinizin geri kalanı için IoT otomasyon rehberiyle başlayın.
Sık Sorulan Sorular
Shelly MQTT yerel web arayüzünün yerini alır mı?
Hayır. MQTT etkinken web arayüzü ve HTTP RPC uç noktası çalışmaya devam eder; böylece broker'a ulaşılamasa bile cihazı yerel olarak yapılandırabilir ve kontrol edebilirsiniz.
events/rpc ile status topic'leri arasındaki fark nedir?
events/rpc genellikle yalnızca değişeni içeren JSON-RPC bildirimlerini taşırken, status/<component> bir bileşenin eksiksiz anlık görüntüsünü taşır. Anlık görüntüler dashboard'lar ve veritabanları için daha basittir.
Shelly MQTT ile Home Assistant kullanabilir miyim?
Evet. Home Assistant aynı topic'leri MQTT entegrasyonu üzerinden okuyabilir; yine de birçok kullanıcı yerel Shelly entegrasyonunu tercih eder ve MQTT'yi Node-RED veya bir bulut broker gibi diğer tüketiciler için kullanır.
Gen1 Shelly cihazları aynı topic'leri kullanır mı?
Hayır. Gen1 cihazlar eski shellies/<device-id>/... düzenini kullanır ve JSON-RPC desteklemez; bu nedenle buradaki topic örnekleri yalnızca Gen2 ve Gen3 cihazlar için geçerlidir.



