IoT Otomasyon

MQTT ile Akıllı Priz Enerji İzleme: Güç Verisi Toplayın ve Günlük Tüketimi Grafiğe Dökün

MQTT destekli akıllı prizlerden güç ve enerji ölçümlerini toplayın, küçük bir Python aboneliğiyle SQLite'a kaydedin ve bunları priz yeniden başlatmalarına ve sayaç sıfırlamalarına dayanıklı, cihaz başına günlük kWh grafiklerine dönüştürün.

MQTT akıllı priz projesinde mutfak cihazlarına takılı prizlerin günlük tüketim çubuk grafiğini beslemesi
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 ile akıllı priz izleme, evinizdeki her cihazın çalıştırma maliyetini öğrenmenin en ucuz yoludur. Bu eğitimde Tasmota ve Shelly prizleri bir broker'a bağlayacak, farklı payload'larını normalize edecek, ölçümleri bir Python aboneliğiyle SQLite'a kaydedecek ve cihaz başına günlük kWh grafiği üreteceksiniz. Yaklaşım, ev yapımı enerji kaydedicilerin çoğunun sessizce hata yaptığı yerleri, yani yeniden başlatmaları ve sayaç sıfırlamalarını da ele alır.

Hangi Akıllı Prizler MQTT Konuşur?

Yalnızca üreticinin bulutuna değil, sizin seçtiğiniz bir broker'a yayın yapabilen bir prize ihtiyacınız var. Bu amaçla pazarın büyük kısmını üç aile karşılar:

Priz ailesi MQTT nasıl etkinleştirilir Enerji alanları Notlar
Tasmota yüklü prizler (birçok ESP tabanlı model) Tasmota firmware'inde yerleşik ENERGY.Power (W), ENERGY.Total (kWh), Today, Yesterday Bazı modeller Tasmota ile gelir; diğerlerine flash gerekir
Shelly Plug S Gen3 / Plus Plug Yerel web arayüzü, Settings > MQTT apower (W), aenergy.total (Wh) Gen2/Gen3 JSON-RPC API
ESPHome tabanlı prizler ESPHome YAML'ında mqtt: bloğu Sensör başına bir topic Esnek ama varlık başına ayrı topic'ler

Satın almadan önce prizin güç ölçümü yaptığını kontrol edin; birçok ucuz priz yalnızca açıp kapatır. Ayrıca nominal akımı cihazla karşılaştırın; su ısıtıcıları, ısıtıcılar ve kurutma makineleri çoğu prizin sınırına yakındır.

Tasmota Prizi Bağlama

Tasmota web arayüzünü açın, ardından Configuration > Configure MQTT bölümüne gidin ya da daha hızlı kurulum için konsolu kullanın. Backlog komutu birkaç ayarı tek seferde uygular ve prizi yeniden başlatır:

Backlog MqttHost broker.connectmq.com; MqttPort 1883; MqttClient plug-kitchen-kettle-9f2; Topic kettle; FullTopic connectmq/demo/p4w8/%prefix%/%topic%/; TelePeriod 60

Bu ayar, prizin telemetrisini her 60 saniyede bir connectmq/demo/p4w8/tele/kettle/SENSOR topic'ine aşağıdakine benzer bir payload ile yayınlamasını sağlar:

{
  "Time": "2026-10-16T07:31:12",
  "ENERGY": {
    "TotalStartTime": "2025-11-02T18:04:51",
    "Total": 48.215,
    "Yesterday": 0.412,
    "Today": 0.197,
    "Period": 3,
    "Power": 0,
    "ApparentPower": 0,
    "ReactivePower": 0,
    "Factor": 0.00,
    "Voltage": 231,
    "Current": 0.000
  }
}

Total kWh cinsinden ömür boyu enerji, Power ise watt cinsinden anlık aktif güçtür. Public test broker paylaşımlı ve herkes tarafından okunabilir olduğu için p4w8 gibi rastgele bir yol segmenti kullanın. TLS derlemeleri dahil Tasmota'ya özgü ayrıntılar Tasmota MQTT rehberinde ele alınıyor.

Shelly Prizi Bağlama

Bir Shelly Plus Plug veya Plug S Gen3'te yerel web arayüzünü açın, Settings > MQTT bölümüne gidin, MQTT'yi etkinleştirin, sunucuyu broker.connectmq.com:1883, öneki connectmq/demo/p4w8/shelly/fridge olarak ayarlayın ve Generic status update over MQTT seçeneğini etkinleştirin. Priz bundan sonra connectmq/demo/p4w8/shelly/fridge/status/switch:0 üzerinde eksiksiz anlık görüntüler yayınlar; burada apower watt, aenergy.total ise kWh değil watt-saat cinsinden ömür boyu enerjidir. Markaları birleştirirken en sık yapılan hata bu birimleri karıştırmaktır. Topic ve RPC yapısının tamamı Shelly MQTT kurulum rehberinde açıklanıyor.

MQTT Akıllı Priz Veri Hattını Tasarlama

Her priz zaten broker'a yayın yapıyor; eksik parça, dinleyip geçmişi tutan bir bileşen. Broker'lar canlı mesajları ve retained değerleri iletir ama veritabanı değildir; bu yüzden kaydedici ayrı bir MQTT istemcisidir. Plan şu:

  1. Joker karakterlerle her iki priz biçimine de abone olun.
  2. Her mesajı (time, plug, power_w, total_kwh) biçimine normalize edin.
  3. Her örneği SQLite'a kaydedin.
  4. Günlük enerjiyi ardışık ömür boyu toplamlar arasındaki farktan hesaplayın; sayaç sıfırlamalarının yol açtığı negatif sıçramaları yok sayın.
  5. Her priz için gün başına bir çubuk serisi çizin.

Neden gücü entegre etmek yerine ömür boyu toplamlardan hesaplıyoruz? Çünkü güç dakikada bir örneklenir ve iki örnek arasında 90 saniye çalışan bir su ısıtıcısı sıfır olarak görünebilir. Prizin kendi enerji sayacı kesintisiz ölçüm yapar; bu nedenle toplamın farkları seyrek örneklemede bile doğrudur. Bir mesaj kaybolursa bir sonraki fark yalnızca daha uzun bir dönemi kapsar.

Python Kaydedici

pip install "paho-mqtt>=2.0" matplotlib
import json
import sqlite3
import sys
from datetime import datetime
import paho.mqtt.client as mqtt

PREFIX = "connectmq/demo/p4w8"
DB = sqlite3.connect("plugs.db", check_same_thread=False)
DB.execute("""CREATE TABLE IF NOT EXISTS samples (
    ts TEXT, plug TEXT, power_w REAL, total_kwh REAL)""")
DB.commit()


def normalize(topic, payload):
    parts = topic.split("/")
    data = json.loads(payload)
    if "/tele/" in topic and topic.endswith("/SENSOR"):
        e = data.get("ENERGY")
        if not e:
            return None
        return parts[-2], float(e["Power"]), float(e["Total"])
    if "/shelly/" in topic and topic.endswith("/status/switch:0"):
        if "aenergy" not in data:
            return None
        plug = parts[parts.index("shelly") + 1]
        return plug, float(data.get("apower", 0)), float(data["aenergy"]["total"]) / 1000.0
    return None


def on_connect(client, userdata, flags, reason_code, properties):
    print("Connected:", reason_code)
    client.subscribe(f"{PREFIX}/tele/+/SENSOR", qos=1)
    client.subscribe(f"{PREFIX}/shelly/+/status/switch:0", qos=1)


def on_message(client, userdata, msg):
    try:
        row = normalize(msg.topic, msg.payload)
    except (ValueError, KeyError) as exc:
        print("Skipping", msg.topic, exc)
        return
    if row is None:
        return
    plug, power, total = row
    DB.execute("INSERT INTO samples VALUES (?, ?, ?, ?)",
               (datetime.now().isoformat(timespec="seconds"), plug, power, total))
    DB.commit()
    print(f"{plug:12s} {power:8.1f} W  {total:10.3f} kWh")


def daily_kwh():
    rows = DB.execute("SELECT ts, plug, total_kwh FROM samples ORDER BY plug, ts").fetchall()
    result, last = {}, {}
    for ts, plug, total in rows:
        day = ts[:10]
        prev = last.get(plug)
        last[plug] = total
        if prev is None:
            continue
        delta = total - prev
        if delta < 0:          # counter reset or plug replaced: skip this interval
            continue
        result.setdefault(plug, {}).setdefault(day, 0.0)
        result[plug][day] += delta
    return result


def plot():
    import matplotlib.pyplot as plt
    data = daily_kwh()
    days = sorted({d for per in data.values() for d in per})
    width = 0.8 / max(len(data), 1)
    fig, ax = plt.subplots(figsize=(10, 5))
    for i, (plug, per_day) in enumerate(sorted(data.items())):
        xs = [n + i * width for n in range(len(days))]
        ax.bar(xs, [per_day.get(d, 0) for d in days], width, label=plug)
    ax.set_xticks([n + 0.4 - width / 2 for n in range(len(days))])
    ax.set_xticklabels(days, rotation=45, ha="right")
    ax.set_ylabel("kWh per day")
    ax.legend()
    fig.tight_layout()
    fig.savefig("daily_kwh.png", dpi=120)
    for plug, per_day in sorted(data.items()):
        print(plug, {d: round(v, 3) for d, v in sorted(per_day.items())})


if __name__ == "__main__":
    if sys.argv[1:] == ["plot"]:
        plot()
    else:
        client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="plug-logger-3391")
        client.on_connect = on_connect
        client.on_message = on_message
        client.connect("broker.connectmq.com", 1883, keepalive=60)
        client.loop_forever()

python plug_logger.py komutunu çalışır halde bırakın; bir iki gün sonra daily_kwh.png dosyasını üretmek ve rakamları yazdırmak için python plug_logger.py plot çalıştırın. Günler kaydedicinin yerel saatine göre gruplanır; ev içi raporlama için genellikle istenen de budur.

Rakamları Anlamlandırma

Bir haftalık veriniz olduğunda genellikle birkaç örüntü öne çıkar:

  • Bekleme yükleri. Hiçbir zaman birkaç watt'ın altına düşmeyen televizyonlar, oyun konsolları ve ağ cihazları bir yıl içinde ciddi bir toplam oluşturur. Yalnızca günlük toplama değil, priz başına minimum power_w değerine de bakın.
  • Buzdolapları ve dondurucular düzenli bir çalışma döngüsü gösterir. Aynı oda sıcaklığında artan bir günlük toplam, bozulan bir conta veya kirli bir kondenser işareti olabilir.
  • Kısa süreli yüksek yükler, örneğin su ısıtıcıları ve kahve makineleri, güç örneklerinde neredeyse hiç görünmez ama enerji sayacı onları yakalar; bu da fark yöntemini doğrular.
  • Yıllık maliyet, günlük kWh'nin 365 ve tarifenizle çarpımıdır. Hangi değişikliğin yapmaya değer olduğunu bilmek için bunu priz bazında hesaplayın.

Karşılaştırma için tüm evin görünümünü görmek isterseniz MQTT ile ev enerji izleme eğitimine bakın.

MQTT Akıllı Priz Verilerini Uyarılara Dönüştürme

Geçmiş size ne olduğunu söyler; uyarılar ise olay hâlâ sürerken haber verir. Her ölçüm zaten broker üzerinden aktığı için prizlere dokunmadan uyarı ekleyebilirsiniz:

  • Dondurucu durdu. Bir saatten uzun süre birkaç watt'ın altında raporlayan bir dondurucu prizi genellikle atmış bir termostat veya açık kalmış bir kapı demektir. ConnectMQ portalının eşik tabanlı uyarı kuralları bir topic'teki sayısal bir alanı izleyebilir; "bir saatten uzun süre" koşulunu ise bir Python veya Node-RED aboneliği ekleyebilir.
  • Unutulan cihaz. Normalden uzun süre güç çeken bir ütü, ısıtıcı veya saç düzleştirici, klasik bir MQTT akıllı priz otomasyonudur: bir zaman aşımından sonra prizin komut topic'ine off yayınlayın.
  • Çamaşır makinesi bitti. Gücün yüzlerce watt'tan sıfıra yakın bir değere düşüp birkaç dakika orada kalması, telefon bildirimi için güvenilir bir "program bitti" sinyalidir.

Mantığı cihazlara dağıtmak yerine tek bir abonelikte tutun; böylece hiçbir şeyi yeniden flash'lamadan eşikleri değiştirebilirsiniz.

Sorun Giderme Kontrol Listesi

Sorun Neden Çözüm
Günlük toplamlar 1000 kat büyük Shelly Wh değeri kWh olarak işlenmiş aenergy.total değerini 1000'e bölün
Dakikalarca Tasmota verisi yok TelePeriod çok uzun TelePeriod 60 veya daha düşük ayarlayın (minimum 10)
Prizler birbirinin bağlantısını koparıyor Yinelenen MQTT client ID'leri Her priz için benzersiz MqttClient
Negatif günlük değerler Sayaç sıfırlaması ele alınmamış Yukarıdaki gibi negatif farkları atlayın
Güç ölçümleri yanlış görünüyor Kalibre edilmemiş priz Tasmota'da PowerSet, VoltageSet, CurrentSet ile kalibre edin

Özel Bir Broker'a Geçiş

Public broker bu deney için mükemmeldir; ancak enerji verisi evde ne zaman olduğunuzu ele verir ve önekinizi tahmin eden herkes prizlerinizi de açıp kapatabilir. Kurulumu sürekli çalışır halde bırakmadan önce kimlik bilgileri ve TLS içeren bir bulut MQTT broker'a geçin. ConnectMQ ile portalda bir broker oluşturun, ardından her prize kendi kullanıcı adını, parolasını ve client ID'sini verin. Tasmota'da bu, TLS destekli bir derleme ve MqttPort 8883 anlamına gelir; Shelly'de ise SSL'i dahili CA paketiyle etkinleştirin. Kaydediciye şunu ekleyin:

client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
client.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
client.tls_set()
client.connect("broker.connectmq.com", 8883, keepalive=60)

Ücretsiz Serverless planının 25 bağlantısı bir düzine priz, kaydedici ve bir dashboard için yeterlidir. Tamamen yönetilen bir MQTT servisi, broker'a router'ınızda port açmadan telefonunuzdan erişebilmeniz anlamına da gelir. IoT otomasyon rehberi, priz verilerinin otomasyonları nasıl tetikleyebileceğini de gösteriyor.

Prizlerinizi ConnectMQ ile İzlemeye Başlayın

ConnectMQ, akıllı prizlerinize, kaydedicilerinize ve dashboard'larınıza canlı topic gezgini ve eşik tabanlı uyarı kuralları sunan, TLS ile korunan özel bir broker sağlar; örneğin bir dondurucu prizi çok uzun süre sıfır watt raporladığında sizi uyarmak için. app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun.

Sık Sorulan Sorular

Her akıllı priz MQTT verisi gönderebilir mi?

Hayır. Yalnızca firmware'inde MQTT bulunan prizler, örneğin Tasmota, Shelly Gen2/Gen3 veya ESPHome cihazları, seçtiğiniz bir broker'a yayın yapabilir. Yalnızca buluta bağlı prizler bunun yerine üretici entegrasyonuna ihtiyaç duyar.

Akıllı priz enerji ölçümleri ne kadar doğru?

Cihazları karşılaştırmak ve israfı tespit etmek için genellikle yeterince iyidirler, ancak faturalama sınıfı sayaç değildirler. Bilinen bir rezistif yüke göre kalibrasyon, Tasmota prizlerinde doğruluğu belirgin şekilde artırır.

Neden güç değeri yerine enerji toplamı kullanılıyor?

Priz enerjiyi sürekli olarak entegre eder, güç ise yalnızca bir mesaj gönderildiğinde örneklenir. Ömür boyu toplamlar arasındaki farklar, güç örneklerinin kaçırdığı kısa yükleri de yakalar.

Bir akıllı priz ne sıklıkla yayın yapmalı?

Geçmiş ve dashboard'lar için 30 ila 60 saniyede bir iyi bir dengedir. Daha kısa aralıklar trafiği artırır ama günlük toplamları iyileştirmez, çünkü bunlar enerji sayacından gelir.

İlgili yazılar

Zigbee2MQTT Kurulum Rehberi: Koordinatörden Panoya

Zigbee2MQTT'yi Docker ile kurun, koordinatörü ve MQTT bağlantısını yapılandırın, cihazları eşleştirip yeniden adlandırın, onları MQTT üzerinden kontrol edin ve durumlarını bir panoda görüntüleyin; önce ücretsiz herkese açık bir broker'da test edin.

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