MQTT tabanlı bir ev enerji izleme kurulumu, tüm evinizin ne tükettiğini saniye saniye gösterir ve bu değeri çalıştırdığınız her dashboard ve otomasyona açar. Bu rehberde akıllı sayaç okuyucusu ile CT pensler arasında seçim yapacak, tüketimi bir Python betiğiyle yayınlayacak ve Telegraf ile InfluxDB kullanarak saklayıp grafiğe dökeceksiniz. Ayrıca güneş enerjisi öz tüketimi için hangi rakamların önemli olduğunu ve verilerin nasıl gizli tutulacağını da göreceksiniz.
Tüm Evi Ölçmenin İki Yolu
Ölçümü dağıtım şirketinin sayacında veya dağıtım panonuzda yapabilirsiniz. İkisi de iyi çalışır; doğru seçim sayacınıza ve elektrik işleri konusundaki rahatlığınıza bağlıdır.
| Yaklaşım | İhtiyacınız olan | Ölçtükleri | Zahmet ve güvenlik |
|---|---|---|---|
| Akıllı sayaç portu (P1 / DSMR, diğer tüketici portları) | Müşteri portu etkin bir sayaç, USB kablo veya ESP tabanlı okuyucu | Çekilen ve verilen enerji, tarifeler, gerilim, çoğu zaman doğalgaz | Tak-çalıştır, elektrik işi yok |
| Hazır CT sayaç (ör. Shelly Pro 3EM, Shelly EM) | Pensli, panoya monte edilen cihaz | Faz başına güç, enerji, gerilim | Panoya yetkili bir kişi tarafından kurulur |
| DIY CT pensler (SCT-013 + ESP32) | Pensler, yük direnci, bias devresi | Devre başına akım, tahmini güç | Pensler kabloyu kesmez, ancak panoya erişim yine gerekir |
| Sayaç üzerindeki darbe LED'i | LED'in üzerine bantlanmış ışık sensörü | Darbe hızından enerji | Elektrik işi yok, daha düşük çözünürlük |
Hollanda, Belçika ve Lüksemburg'da çoğu akıllı sayacın her saniye (DSMR 5) veya her on saniyede bir (DSMR 4) metin tabanlı bir "telegram" gönderen bir P1 portu vardır. Rakamlar dağıtım şirketinizin faturaladığı rakamlar olduğu için bu en kolay ve en doğru kaynaktır. Başka yerlerde eşdeğer bir müşteri arayüzü arayın veya CT pens kullanın.
Bir sigorta kutusunun içindeki her türlü çalışma yetkili bir elektrikçi tarafından yapılmalıdır. Pens tipi sensörler kablo kesmez, ancak panoyu açmak gerilim altındaki parçaları açığa çıkarır.
MQTT Ev Enerji İzleme Akışı İçin Topic Tasarımı
Sayaç başına kompakt JSON payload'lı tek bir telemetri topic'i ve retained bir durum topic'i kullanın:
connectmq/demo/<random-id>/energy/grid/telemetry (JSON, every 1-10 s)
connectmq/demo/<random-id>/energy/grid/status (online/offline, retained)
{
"import_w": 1193,
"export_w": 0,
"net_w": 1193,
"import_kwh_t1": 4182.517,
"import_kwh_t2": 3970.204,
"export_kwh_t1": 1520.110,
"export_kwh_t2": 3184.623,
"voltage_l1": 230.1,
"ts": 1760605123
}
net_w değerini (çekilen eksi verilen) işaretli bir değer olarak yayınlayın. Güneş ve batarya otomasyonları bu tek sayıyla ilgilenir: negatif değer şebekeye enerji verdiğiniz anlamına gelir.
Python ile P1 Akıllı Sayacı Okuma
Bir P1-USB kablosunu bir Raspberry Pi'ye veya herhangi bir Linux makineye bağlayın. DSMR 4 ve 5 sayaçları 115200 baud, 8 veri biti, paritesiz, 1 stop biti kullanır. Her telegram / ile başlar, ! ve bir CRC ile biter ve 1-0:1.7.0(01.193*kW) gibi satırlar içerir. İhtiyacınız olan OBIS kodları:
| OBIS kodu | Anlamı | Birim |
|---|---|---|
1-0:1.8.1 / 1-0:1.8.2 |
Çekilen enerji, tarife 1 / 2 | kWh |
1-0:2.8.1 / 1-0:2.8.2 |
Verilen enerji, tarife 1 / 2 | kWh |
1-0:1.7.0 |
Anlık çekilen güç | kW |
1-0:2.7.0 |
Anlık verilen güç | kW |
1-0:32.7.0 |
L1 gerilimi | V |
0-1:24.2.1 |
Doğalgaz sayacı okuması (zaman damgalı) | m3 |
Bağımlılıkları kurun:
pip install "paho-mqtt>=2.0" pyserial
import json
import re
import time
import uuid
import serial
import paho.mqtt.client as mqtt
PORT = "/dev/ttyUSB0"
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/energy/grid"
PUBLISH_EVERY = 5 # seconds; DSMR 5 sends a telegram every second
LINE = re.compile(r"^(\d+-\d+:\d+\.\d+\.\d+)\((.*)\)$")
VALUE = re.compile(r"([\d.]+)\*")
FIELDS = {
"1-0:1.8.1": ("import_kwh_t1", 1),
"1-0:1.8.2": ("import_kwh_t2", 1),
"1-0:2.8.1": ("export_kwh_t1", 1),
"1-0:2.8.2": ("export_kwh_t2", 1),
"1-0:1.7.0": ("import_w", 1000), # kW -> W
"1-0:2.7.0": ("export_w", 1000),
"1-0:32.7.0": ("voltage_l1", 1),
}
def parse(telegram):
out = {}
for line in telegram.splitlines():
m = LINE.match(line.strip())
if not m or m.group(1) not in FIELDS:
continue
name, factor = FIELDS[m.group(1)]
v = VALUE.search(m.group(2))
if v:
out[name] = round(float(v.group(1)) * factor, 3)
if "import_w" in out and "export_w" in out:
out["net_w"] = round(out["import_w"] - out["export_w"], 1)
return out
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"p1-{uuid.uuid4().hex[:6]}")
mq.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
mq.connect("broker.connectmq.com", 1883, keepalive=60)
mq.loop_start()
mq.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
print("Publishing to", PREFIX)
ser = serial.Serial(PORT, 115200, bytesize=8, parity="N", stopbits=1, timeout=12)
buf, last_pub = [], 0.0
while True:
raw = ser.readline().decode("ascii", errors="ignore")
if not raw:
continue
if raw.startswith("/"):
buf = [raw]
elif buf:
buf.append(raw)
if raw.startswith("!"):
data = parse("".join(buf))
buf = []
if data and time.time() - last_pub >= PUBLISH_EVERY:
data["ts"] = int(time.time())
mq.publish(f"{PREFIX}/telemetry", json.dumps(data), qos=0, retain=True)
last_pub = time.time()
print(data)
Betik yayını beş saniyede bir mesajla sınırlar. Bu dashboard'lar için fazlasıyla yeterlidir ve public test broker'ın istemci başına saniyede 10 mesaj limitinin çok altında kalır. Production için her telegramın CRC16 doğrulamasını ekleyin; bozuk telegramlar nadirdir ama uzun kablolarda gerçekten olur.
Raspberry Pi yerine ESP tabanlı bir P1 okuyucu mu tercih edersiniz? Birçok açık kaynak firmware projesi DSMR verisini doğrudan MQTT'ye yayınlar; onları aynı broker'a ve topic düzenine yönlendirin.
CT Pens Yolu
Kullanılabilir bir sayaç portunuz yoksa, Shelly Pro 3EM gibi üç fazlı bir CT sayaç az zahmetli bir seçenektir. Yapılandırıldıktan sonra faz başına gücü ve toplamları MQTT üzerinden yayınlar; topic'lerini ve TLS ayarlarını Shelly MQTT rehberi açıklıyor. ESP32 ve SCT-013 penslerle yapılan DIY kurulumlar da popülerdir; ancak tek başına bir akım pensinin çekilen ve verilen enerjiyi ayırt edemeyeceğini unutmayın: gerçek gücü ve yönünü hesaplamak için bir gerilim referansına ihtiyacınız var. Tek tek cihazlar için prizler daha basittir; bkz. MQTT ile akıllı priz enerji izleme.
Telegraf ve InfluxDB ile Saklama ve Grafiğe Dökme
Broker canlı değerleri iletir ama geçmişi tutmaz. Telegraf'ın mqtt_consumer girdisi diğer istemciler gibi abone olur ve verileri, Grafana'nın veya InfluxDB'nin kendi arayüzünün grafiğe dökebileceği InfluxDB'ye yazar.
[[inputs.mqtt_consumer]]
servers = ["tcp://broker.connectmq.com:1883"]
topics = ["connectmq/demo/+/energy/+/telemetry"]
client_id = "telegraf-energy-5527"
qos = 0
data_format = "json"
name_override = "energy"
json_time_key = "ts"
json_time_format = "unix"
[[inputs.mqtt_consumer.topic_parsing]]
topic = "connectmq/demo/+/energy/+/telemetry"
tags = "_/_/_/_/meter/_"
[[outputs.influxdb_v2]]
urls = ["http://localhost:8086"]
token = "YOUR_INFLUX_TOKEN"
organization = "home"
bucket = "energy"
topic_parsing bloğu topic'teki sayaç adını bir etikete (tag) dönüştürür; böylece grid, solar ve heatpump sayaçları meter etiketli tek bir ölçümde toplanır. İlk oluşturulması faydalı grafikler:
- Son 24 saatteki net güç; sıfır çizgisi vurgulanarak şebekeye verilen enerji belirgin hale getirilir.
- Gün başına kWh sayaçlarının farkından günlük çekilen ve verilen enerji.
- Baz yük, yani gece 2 ile 5 arasındaki en düşük net güç; sürekli açık tüketicileri ortaya çıkarır.
- Esnek yüklerin gerçekten ucuz dönemde çalıştığını kontrol etmek için tarifeye göre çekilen enerji.
Node-RED dashboard'ları ve Home Assistant da aynı derecede iyi çalışır; her biri yalnızca telemetri topic'ine abone olur.
Rakamlara Göre Harekete Geçme
MQTT üzerindeki canlı bir net_w değeri bir grafikten fazlasıdır; otomasyon için bir girdidir. Erken kurulmaya değer birkaç kalıp:
- Fazla üretimle anahtarlama.
net_wbirkaç dakika boyunca negatif bir eşiğin altında kaldığında (yani şebekeye enerji veriyorsanız) bir termosifonu, bulaşık makinesini veya elektrikli araç şarj cihazını açın; şebekeden çekiş geri döndüğünde histerezisle yeniden kapatın. - Tepe yük sınırlama. Çekilen güç ana sigortanızın veya kapasite tarifenizin izin verdiği sınıra yaklaşırsa, bir sigortayı attırmak veya tepe ücreti ödemek yerine esnek yükleri erteleyin.
- Baz yük uyarıları. Gece baz yükünün aniden iki katına çıkması çoğu zaman arızalı bir cihaza, takılı kalmış bir pompaya veya açık unutulmuş bir ısıtıcıya işaret eder.
Bu kurallar Node-RED'de, Home Assistant'ta veya kısa bir Python aboneliğinde rahatça çalışır; hepsi broker'a normal istemciler olarak bağlanır ve aynı telemetri topic'ini okur.
Kaçınılması Gereken Tuzaklar
- Enerjiyi güç örneklerinden saymak. Örneklenmiş gücü entegre etmek zamanla sapar. Günlük toplamlar için sayacın kWh sayaçlarını kullanın.
- kW ile W'yi karıştırmak. DSMR gücü kW cinsinden raporlar; dönüşümü bir kez, kaynakta yapın.
- Yüksek frekanslı veriyi gereksiz yere retained yapmak. Retained özelliği en son değer için faydalıdır, ancak saniyelik veriyi ayrı topic'lerde retained tutmaya gerek yoktur.
- Saat kayması. İletimdeki gecikmelerin grafikleri bozmaması için ölçüm zamanı olarak yayıncının zaman damgası alanını (
ts) kullanın. - Açık ortamda yayınlamak. Saniye saniye tüketim, evde mi yoksa dışarıda mı olduğunuzu ele verir. Public test broker yalnızca deneyler içindir.
Özel Bir Broker'a Geçiş
Kalıcı bir ev enerji izleme sistemi için TLS'li özel bir broker'a yayın yapın. ConnectMQ gibi bir barındırılan MQTT broker, Raspberry Pi üzerinde bakımı yapılacak bir broker olmaması ve router portlarını açmadan telefonunuzdan güvenli uzaktan erişim anlamına gelir. ConnectMQ portalında bir broker oluşturun, ardından istemci ve Telegraf ayarlarını değiştirin:
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="YOUR_CLIENT_ID")
mq.username_pw_set("YOUR_USERNAME", "YOUR_PASSWORD")
mq.tls_set()
mq.connect("broker.connectmq.com", 8883, keepalive=60)
servers = ["ssl://broker.connectmq.com:8883"]
username = "YOUR_USERNAME"
password = "YOUR_PASSWORD"
Her istemcinin (P1 okuyucu ve Telegraf) kendi kimlik bilgilerine ve client ID'sine ihtiyacı vardır. Üretimle karşılaştırmak için güneş inverter izleme ekleyin; enerji farkındalıklı otomasyonun daha geniş resmi için IoT otomasyon rehberini okuyun. Broker'ı nerede barındıracağınıza karar veriyorsanız bulut MQTT broker rehberi seçenekleri karşılaştırıyor.
Evinizin Enerjisini ConnectMQ'da Canlı İzleyin
ConnectMQ, sayaç okuyucularınıza, Telegraf'a ve dashboard'larınıza TLS, tarayıcı dashboard'ları için WebSocket erişimi ve eşik tabanlı uyarı kuralları sunan tek bir güvenli broker sağlar; örneğin net çekiş ana sigorta bütçenizi aştığında. app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun.
Sık Sorulan Sorular
Akıllı sayacımda P1 portu var mı?
Hollanda, Belçika ve Lüksemburg'daki sayaçlarda genellikle vardır ve bazı ülkelerde portun şebeke işletmecisi tarafından etkinleştirilmesi gerekir. Diğer bölgeler farklı müşteri arayüzleri kullanır ya da hiç arayüz sunmaz; bu durumda alternatifler CT pensler veya darbe LED okuyucusudur.
Bir ev enerji izleme sistemi MQTT üzerinden ne sıklıkla yayın yapmalı?
1 ila 10 saniyede bir yaygındır. Hızlı güncellemeler güneş fazlası kontrolüne yardımcı olur; geçmiş ve günlük toplamlar ise kWh sayaçlarından geldiği için daha düşük hızlarda da sorunsuz çalışır.
CT pensler güneşten şebekeye verilen enerjiyi algılayabilir mi?
Yalnızca cihaz gerçek gücü ve işaretini hesaplamak için gerilimi de ölçüyorsa. Yalnızca akım ölçen pensler ne kadar akım aktığını gösterir ama hangi yönde aktığını göstermez.
InfluxDB zorunlu mu?
Hayır. Verileri herhangi bir abone saklayabilir: Home Assistant'ın recorder bileşeni, bir veritabanına yazan Node-RED akışı veya CSV dosyalarına yazan basit bir Python betiği.



