Yönetilen MQTT Bulutu

MQTT Eşik Değeri Alarmları: Değerler Aralık Dışına Çıktığında Haberdar Olun

MQTT sensör değerleri güvenli aralığın dışına çıktığında nasıl alarm üreteceğinizi öğrenin: ConnectMQ portalındaki kurallar, bildirim için bir Node-RED akışı ve alarm fırtınalarını önlemek için histerezis ile debounce kullanan bir Python alarm servisi.

Kırmızı limit çizgisini aşan bir sıcaklık eğrisi ve günlükte beliren bir alarm kaydıyla MQTT eşik değeri alarmları dashboard'u
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

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:

  1. Portala giriş yapın ve broker'ınızı açın.
  2. Canlı topic gezgininde factory1/utilities/tank1/telemetry topic'ini bularak verinin geldiğini doğrulayın.
  3. Bu topic için temperature alanında, üst limiti 70 olan bir eşik değeri alarm kuralı oluşturun.
  4. pressure alanında üst limiti 5 olan ikinci bir kural oluşturun.
  5. 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:

  1. factory1/utilities/+/telemetry topic'ine abone olan, çıktısı "a parsed JSON object" olan bir mqtt in node'u.
  2. Aşağıdaki eşik mantığını içeren bir function node'u.
  3. 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:

  1. Ekipman limitlerinden ve proses spesifikasyonlarından başlayın, ardından tepki vermeye zaman kalması için alarmı kesin limitin altına ayarlayın.
  2. İşe yaradığı yerde iki seviye kullanın: bir uyarı ve bir kritik alarm.
  3. Temizleme eşiğini, normal gürültüyü yutacak kadar alarm eşiğinden uzak tutun.
  4. 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}/state topic'i ya da bir Last Will mesajı, bir cihazın bağlantısının koptuğunu size bildirir.
  5. 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.

İlgili yazılar

BYOC MQTT Broker: Kendi Bulutunuzu Getirin Modeli Açıklandı

BYOC MQTT broker sizin bulut hesabınızda çalışır ama bir sağlayıcı tarafından işletilir. Modelin nasıl işlediğini, sorumluluk paylaşımını ve hesabınızı buna nasıl hazırlayacağınızı öğrenin.

7 dk okuma

Google Cloud IoT Core Alternatifi: Kapanış Sonrası Seçenekler ve Geçiş

Google, Cloud IoT Core'u Ağustos 2023'te kullanımdan kaldırdı. Bu rehber gerçekçi alternatifleri karşılaştırıyor, IoT Core kavramlarını standart MQTT'ye eşliyor ve verileriniz Google Cloud'a akmaya devam ederken cihazlarınızı yönetilen bir broker'a nasıl taşıyacağınızı gösteriyor.

7 dk okuma

Saniyede MQTT Mesaj Sayısı: Verim Nasıl Tahmin Edilir ve Ölçülür

MQTT verim planlaması birkaç formüle ve tek bir dürüst ölçüme dayanır. Saniyedeki gelen ve giden mesaj sayısını nasıl tahmin edeceğinizi, tepe değerleri nasıl hesaba katacağınızı ve sonucu bir broker planına nasıl eşleyeceğinizi öğrenin.

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