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:
- Joker karakterlerle her iki priz biçimine de abone olun.
- Her mesajı
(time, plug, power_w, total_kwh)biçimine normalize edin. - Her örneği SQLite'a kaydedin.
- 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.
- 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_wdeğ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
offyayı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.



