MQTT eşik değeri alarmları, kimsenin bir dashboard'a bakıp durmasına gerek kalmadan bir sıcaklık, basınç veya seviye okuması güvenli aralığın dışına çıktığı anda sizi haberdar eder. Bu eğitimde gerçekçi sensör verisi yayınlayacak, ConnectMQ portalında eşik değeri alarm kuralları oluşturacak, Node-RED'de kişilere bildirim gönderebilen eşdeğer bir alarm kuracak ve limitin etrafında dolaşan bir değerin sizi alarmlara boğmaması için histerezis ile debounce ekleyeceksiniz.
MQTT Eşik Değeri Alarmları Nasıl Çalışır?
MQTT'nin kendisinde alarm kavramı yoktur. Eşik değeri alarmı; bir veya daha fazla topic'i izleyen, her payload'dan sayısal bir değer çıkaran ve bunu bir limitle karşılaştıran bir subscriber'dır. Karşılaştırma normalden anormale döndüğünde alarm üretir; geri döndüğünde alarmı temizler. Asıl tasarım kararı bu subscriber'ın nerede çalışacağıdır:
| Yaklaşım | Nerede çalışır | Güçlü yanları | Sınırlamaları |
|---|---|---|---|
| Broker portal kuralları | Yönetilen broker'ınızın portalında | Ek altyapı gerekmez; alarm günlüğü verinin hemen yanında | Bildirim kanalları portalın sunduklarıyla sınırlı |
| Node-RED akışı | Sizin barındırdığınız bir Node-RED instance'ında | Görsel, esnek, çok sayıda bildirim node'u | Node-RED'i siz çalıştırır ve izlersiniz |
| Özel servis | Kendi kodunuz | Mantık ve bildirim üzerinde tam kontrol | En fazla mühendislik ve bakım yükü |
| Cihaz tarafı mantık | Sensörde veya PLC'de | Çevrimdışı çalışır, en hızlı tepki | Kurallar firmware'lere dağılır |
Pek çok ekip bunları birleştirir: hızlı görünürlük için portal kuralları, birine çağrı (page) atılması gereken yerlerde de bir Node-RED veya özel alarm servisi. Güvenlik açısından kritik kilitlemeler (interlock) her zaman yerel kontrol sistemine aittir, asla bir bulut alarmına değil.
Adım 1: Sensör Verisi Yayınlayın
Ara sıra aralık dışına çıkan bir sayı akışına ihtiyacınız var. Bu betik bir tank için her iki saniyede bir sıcaklık ve basınç yayınlar ve zaman zaman aralığın dışına kayar. İstemciyi pip install "paho-mqtt>=2.0" ile kurun.
import json
import math
import random
import time
import paho.mqtt.client as mqtt
# Canlı ortam: TLS ve portal kimlik bilgileriyle 8883 portundaki ConnectMQ broker'ınız.
# Hızlı test: benzersiz bir client ID ile 1883 portundaki herkese açık broker.
HOST, PORT = "broker.connectmq.com", 1883
ROOT = "connectmq/demo/a7f3q2/factory1/utilities/tank1"
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="tank1-sim-a7f3q2")
# Özel broker'ınız için:
# client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
# client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
# client.tls_set()
# PORT = 8883
client.connect(HOST, PORT, keepalive=60)
client.loop_start()
t = 0
while True:
temperature = 60 + 15 * math.sin(t / 30) + random.uniform(-1, 1)
pressure = 4.0 + random.uniform(-0.2, 0.2) + (1.5 if random.random() < 0.03 else 0)
payload = {"temperature": round(temperature, 2),
"pressure": round(pressure, 2),
"ts": int(time.time())}
client.publish(f"{ROOT}/telemetry", json.dumps(payload), qos=1)
t += 1
time.sleep(2)
Sıcaklık yaklaşık 45 ile 75 derece arasında yavaşça salınır ve 70 derecelik limiti düzenli olarak aşar; basınç ise ara sıra 5 barın üzerine fırlar. Herkese açık alan herkes tarafından görülebildiği için topic'teki a7f3q2 kısmını kendi rastgele dizenizle değiştirin.
Adım 2: ConnectMQ Portalında Eşik Değeri Alarm Kuralları Oluşturun
ConnectMQ portalı eşik değeri alarm kuralları ve bir alarm günlüğü içerir; böylece başka hiçbir şey kurmadan değerleri izleyebilirsiniz. Simülatörü kendi broker'ınıza yönlendirin (yukarıdaki yorum satırları), ardından:
- Portala giriş yapın ve broker'ınızı açın.
- Canlı topic gezgininde
factory1/utilities/tank1/telemetrytopic'ini bularak verinin geldiğini doğrulayın. - Bu topic için
temperaturealanında, üst limiti 70 olan bir eşik değeri alarm kuralı oluşturun. pressurealanında üst limiti 5 olan ikinci bir kural oluşturun.- Simülatörü çalışır durumda bırakın ve alarm günlüğünü açın. Bir iki dakika içinde sinüs dalgası tepe yaptıkça sıcaklık aşımları, ara sıra da basınç sıçramaları görünür.
Payload'larınızı simülatördeki gibi sayısal alanlara sahip düz JSON olarak tutun. İç içe dizelere gömülmüş ya da "70.4 C" şeklinde gönderilmiş değerleri herhangi bir alarm aracının değerlendirmesi çok daha zordur. Portalın dashboard'u ve cihazlar görünümü aynı tankı alarmların yanında gösterir; bu da hatta başka neler olduğuna dair bağlama ihtiyaç duyduğunuzda işe yarar.
Adım 3: Node-RED'de Bildirim Gönderen Alarmlar Kurun
Bir alarmın bir telefona, bir sohbet kanalına veya bir ticket sistemine ulaşması gerektiğinde Node-RED, broker'ın pratik bir tamamlayıcısıdır. Broker host'unuz, TLS etkin 8883 portu ve portaldaki kimlik bilgilerinizle bir mqtt-broker config node'u yapılandırın. Ardından şu akışı bağlayın:
factory1/utilities/+/telemetrytopic'ine abone olan, çıktısı "a parsed JSON object" olan bir mqtt in node'u.- Aşağıdaki eşik mantığını içeren bir function node'u.
- Tercih ettiğiniz bildirim node'u: e-posta, bir sohbet entegrasyonu ya da bir olay yönetimi aracına HTTP isteği.
// Node-RED function node'u: tank başına histerezisli eşik değeri alarmı
const HIGH = 70; // sıcaklık bunun üzerine çıkınca alarm üret
const CLEAR = 67; // yalnızca bunun altına düşünce temizle
const tank = msg.topic.split("/")[2];
const value = Number(msg.payload.temperature);
if (Number.isNaN(value)) return null;
const key = `alarm_${tank}`;
const active = context.get(key) || false;
if (!active && value > HIGH) {
context.set(key, true);
msg.payload = { tank, state: "ALARM", temperature: value, limit: HIGH };
return msg;
}
if (active && value < CLEAR) {
context.set(key, false);
msg.payload = { tank, state: "CLEARED", temperature: value };
return msg;
}
return null;
Function node'undan sonra bir filtre node'una gerek yoktur, çünkü yalnızca alarm durumu değiştiğinde mesaj üretir. [2] topic indeksi factory1/utilities/tank1/telemetry gibi topic'leri varsayar; kendi hiyerarşinize göre ayarlayın. Node-RED MQTT eğitimimiz Node-RED kurulumunu ve broker node'unun yapılandırılmasını ayrıntılı olarak anlatır.
Adım 4: Histerezis ve Debounce ile Alarm Fırtınalarını Durdurun
Saf bir "değer 70'ten büyük" kontrolü, değer yüksek kaldığı sürece her mesajda tetiklenir ve gürültü bir okumayı limitin iki yanına itip çektikçe açılıp kapanır. İki teknik bunu çözer:
- Histerezis, alarm üretmek ve temizlemek için ayrı eşikler kullanır (yukarıda 70 ve 67); böylece limit etrafındaki gürültü durumu değiştiremez.
- Debounce, alarm üretmeden önce koşulun sürmesini şart koşar; örneğin art arda üç okuma veya 30 saniye. Elektriksel gürültüden kaynaklanan tek örneklik sıçramaları filtreler.
Aşağıdaki Python alarm servisi ikisini de uygular ve alarm durumunu kendi retained topic'ine yayınlar; böylece dashboard'lar ve diğer sistemler alarmlara diğer tüm veriler gibi abone olabilir:
import json
import paho.mqtt.client as mqtt
HOST, PORT = "broker.connectmq.com", 1883
ROOT = "connectmq/demo/a7f3q2/factory1/utilities"
RULES = {"temperature": (70.0, 67.0), "pressure": (5.0, 4.6)} # üretme, temizleme
DEBOUNCE = 3
state = {} # (tank, alan) -> {"active": bool, "count": int}
def on_connect(client, userdata, flags, reason_code, properties):
client.subscribe(f"{ROOT}/+/telemetry", qos=1)
def on_message(client, userdata, msg):
tank = msg.topic.split("/")[-2]
try:
data = json.loads(msg.payload)
except ValueError:
return
for field, (raise_at, clear_at) in RULES.items():
value = data.get(field)
if not isinstance(value, (int, float)):
continue
s = state.setdefault((tank, field), {"active": False, "count": 0})
if not s["active"]:
s["count"] = s["count"] + 1 if value > raise_at else 0
if s["count"] >= DEBOUNCE:
s["active"] = True
publish_alert(client, tank, field, "ALARM", value, raise_at)
elif value < clear_at:
s["active"], s["count"] = False, 0
publish_alert(client, tank, field, "CLEARED", value, clear_at)
def publish_alert(client, tank, field, status, value, limit):
alert = {"tank": tank, "field": field, "status": status,
"value": value, "limit": limit}
print(alert)
client.publish(f"{ROOT}/{tank}/alerts/{field}", json.dumps(alert),
qos=1, retain=True)
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="alerter-a7f3q2")
client.on_connect = on_connect
client.on_message = on_message
client.connect(HOST, PORT, keepalive=60)
client.loop_forever()
Simülatörün yanında çalıştırın. Onlarca mesaj yerine her aşımda bir ALARM ve değer normale döndüğünde bir CLEARED görürsünüz.
İyi Eşik Değerleri Seçmek
Eşik değerleri bir BT kararı değil, bir proses kararıdır. Kısa bir kontrol listesi yardımcı olur:
- Ekipman limitlerinden ve proses spesifikasyonlarından başlayın, ardından tepki vermeye zaman kalması için alarmı kesin limitin altına ayarlayın.
- İşe yaradığı yerde iki seviye kullanın: bir uyarı ve bir kritik alarm.
- Temizleme eşiğini, normal gürültüyü yutacak kadar alarm eşiğinden uzak tutun.
- Sessizlik için de alarm üretin: yayın yapmayı bırakan bir sensör çoğu zaman yüksek bir değerden daha tehlikelidir. ConnectMQ'daki
$SYS/broker/connection/{clientId}/statetopic'i ya da bir Last Will mesajı, bir cihazın bağlantısının koptuğunu size bildirir. - Alarm geçmişini her ay gözden geçirin ve kimsenin üzerine işlem yapmadığı alarmları kaldırın.
Sabit limitler tek seçenek değildir. Sıcaklığın bir dakikada beş dereceden fazla artması gibi bir değişim hızı kuralı, değer henüz aralık içindeyken bir soğutma arızasını yakaladığı için çoğu zaman mutlak bir limitten daha erken uyarır. Bu kurallar mesajlar arasında durum tutmayı gerektirdiğinden yukarıdaki Node-RED function node'una veya Python alarm servisine doğal olarak uyar: cihaz başına önceki değeri ve zaman damgasını saklayın ve eğimi limitinizle karşılaştırın. Basit eşiklerle başlayın, ardından alarm günlüğünün aşımların geriye dönük bakıldığında belirgin olduğunu gösterdiği yerlere değişim hızı tabanlı kurallar ekleyin.
Bağlantı sayıları ve mesaj hızları gibi daha geniş broker sağlığı sinyalleri için MQTT broker izleme rehberimize göz atın; alarmların diğer konsol özellikleri arasında nereye oturduğunu görmek için de MQTT broker yönetim konsolu yazısını okuyun.
ConnectMQ'da Eşik Değeri Alarmları Kurun
app.connectmq.com adresinde kredi kartı gerekmeden Serverless planında ücretsiz bir broker oluşturun ve ilk eşik değeri alarm kuralınızı dakikalar içinde ekleyin. ConnectMQ, alarm günlüğü, topic gezgini ve dashboard'u tek bir portalda bir araya getiren yönetilen bir MQTT broker sunar. Önce hızlı bir deneme için simülatörü ücretsiz herkese açık MQTT broker'ına karşı çalıştırın; canlı ortamı planlarken de bulut MQTT broker rehberini okuyun.
Sık Sorulan Sorular
Bir MQTT broker kendi başına alarm gönderebilir mi?
MQTT protokolünde alarm özelliği yoktur, ancak bazı yönetilen broker'lar bunu portallarına ekler. ConnectMQ eşik değeri alarm kuralları ve bir alarm günlüğü sunar; telefonlara veya sohbet kanallarına bildirim için onu Node-RED ya da küçük bir subscriber servisiyle birlikte kullanın.
Eşik değeri alarmlarında histerezis nedir?
Bir alarmı temizlemek için onu üretirken kullanılandan farklı bir eşik kullanmak demektir; örneğin 70'in üzerinde alarm üretip 67'nin altında temizlemek. Bu, gürültülü bir değer limit etrafında dolaşırken alarmın açılıp kapanmasını önler.
Bir sensör veri göndermeyi bıraktığında nasıl alarm üretirim?
Bağlantı kopmalarını tespit etmek için bir Last Will mesajı ya da broker'ın bağlantı durumu topic'ini kullanın ve alarm servisinize, beklenen süre içinde mesaj gelmezse tetiklenen bir zaman aşımı ekleyin.
Güvenlik alarmları MQTT eşik değeri alarmlarına dayanmalı mı?
Hayır. Güvenlik fonksiyonları yerel kontrol sistemine aittir. MQTT eşik değeri alarmları, koruyucu kilitlemeler (interlock) için değil, görünürlük ve operasyonel müdahale içindir.



