IoT Otomasyon

MQTT ile Ev Bataryası İzleme: Şarj Durumu, Hücre Voltajları ve Düşük Batarya Uyarıları

Şarj durumu, paket voltajı, akım, hücre voltajı farkı ve sıcaklık gibi BMS verilerini bir MQTT broker'a yayınlayın, ardından invertör kapanmadan önce sorunlardan haberdar olmak için histerezisli düşük batarya ve dengesizlik uyarıları ekleyin.

Ev bataryası izleme için şarj durumu ve hücre voltajı BMS verilerinin bir panoda gösterildiği, duvara monte lityum batarya grubu
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

Ev bataryası izleme; ne kadar enerji depoladığınızı, bataryanın ne kadar yoğun çalıştığını ve herhangi bir hücrenin bir arızaya dönüşmeden çok önce çizgiden sapıp sapmadığını size söyler. Bu eğitimde şarj durumu, paket voltajı, akım, hücre voltajları ve sıcaklık gibi batarya yönetim sistemi (BMS) verilerini, örnek olarak bir Victron Venus OS sistemi kullanarak bir MQTT broker'a yayınlayacaksınız. Ayrıca telefonunuzu bildirime boğmayan düşük batarya ve hücre dengesizliği uyarıları da ekleyeceksiniz.

Bir Ev Bataryasında Neler İzlenmeli?

Bir BMS onlarca değer sunar. Günlük işletme ve erken arıza tespiti için önemli olanlar şunlardır:

Değer Birim Neden önemli Tipik uyarı fikri
Şarj durumu (SoC) % Akşam ve gece için kullanılabilir enerji %20'nin altında düşük, %25'in üstünde temizle
Paket voltajı V SoC için çapraz kontrol, sensör arızalarını tespit eder Kimyanın normal aralığının dışında
Akım A Pozitif şarj, negatif deşarj BMS sınırına yakın sürekli akım
Güç W Voltaj çarpı akım; PV ve şebeke ile kolayca grafiklenir Bilgi amaçlı
Min / maks hücre voltajı V En zayıf ve en güçlü hücre Dinlenme halinde yaklaşık 50 mV'un üzerinde fark
Sıcaklık °C Lityum bataryalar donma noktasının altında şarj edilmemelidir 5 °C'nin altında veya 45 °C'nin üstünde
Alarmlar ve durum bayraklar BMS koruma olayları Herhangi bir aktif alarm

Lityum demir fosfat (LiFePO4) paketlerde hücre voltajı farkı çoğu zaman uzun vadede en bilgilendirici sinyaldir. SoC, BMS tarafından tahmin edilir ve kayabilir; hücre voltajları ise ölçülür. Aydan aya büyüyen bir fark, bir hücre veya dengeleme sorununa işaret eder.

Veriler Nereden Gelir?

BMS verilerini nasıl alacağınız sisteme bağlıdır:

  1. GX cihazlı Victron sistemleri (Venus OS). GX cihazı, dahili D-Bus üzerindeki her değeri sunan yerel bir MQTT broker çalıştırır. Bunu Settings > Services (yeni firmware'lerde Integrations) altında "MQTT on LAN" seçeneğiyle etkinleştirin.
  2. Hibrit invertörler batarya SoC, voltaj ve akımını çoğu zaman PV verilerini sundukları gibi Modbus register'ları üzerinden sunar; Modbus yaklaşımı için güneş invertörü izleme yazısına bakın.
  3. JK, JBD veya Daly BMS kartlı DIY paketler Bluetooth veya UART arayüzü sunar. ESP32 firmware projeleri (ESPHome bileşenleri dahil) bunları okur ve MQTT'ye yayınlar.
  4. CAN veya RS485 portlu rack tipi bataryalar genellikle invertöre raporlama yapar; bu durumda veri kaynağınız invertör olur.

Bu rehberin geri kalanı, MQTT arayüzü iyi belgelendiği için Venus OS'i kullanır; ancak yayınlama ve uyarı mantığı her kaynak için çalışır.

Venus OS MQTT Nasıl Çalışır?

GX cihazı değerleri N/<portal-id>/<service>/<instance>/<path> biçimindeki topic'lerde, {"value": 87.5} gibi bir JSON payload ile yayınlar. Batarya değerleri battery hizmeti altında bulunur:

N/<portal-id>/battery/512/Soc
N/<portal-id>/battery/512/Dc/0/Voltage
N/<portal-id>/battery/512/Dc/0/Current
N/<portal-id>/battery/512/Dc/0/Power
N/<portal-id>/battery/512/Dc/0/Temperature
N/<portal-id>/battery/512/System/MinCellVoltage
N/<portal-id>/battery/512/System/MaxCellVoltage

Örnek numarası (burada 512) kuruluma göre değişir ve hücre voltajı yolları yalnızca BMS bunları raporladığında kullanılabilir. İki ayrıntı insanları şaşırtır. Birincisi, GX cihazı yalnızca bir client düzenli olarak R/<portal-id>/keepalive adresine keepalive isteği gönderdiği sürece yayın yapmaya devam eder; bu olmadan güncellemeler yaklaşık bir dakika sonra durur. İkincisi, portal ID'si N/<portal-id>/system/0/Serial topic'inde görünür; bir betik onu bu şekilde keşfedebilir.

Batarya Verilerini Broker'ınıza Köprüleme

Aşağıdaki betik yerel ağdaki GX cihazına bağlanır, keepalive gönderir, batarya değerlerini toplar ve her 10 saniyede bir kompakt bir JSON özetini kendi broker'ınıza yayınlar. Hesap gerektirmeyen ancak herkes tarafından okunabilen broker.connectmq.com herkese açık alanına karşı test eder; bu yüzden rastgele bir önek kullanır.

pip install "paho-mqtt>=2.0"
import json
import threading
import time
import uuid
import paho.mqtt.client as mqtt

GX_HOST = "192.168.1.70"            # Venus OS GX cihazı
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/battery/house"
PUBLISH_EVERY = 10

PATHS = {
    "Soc": "soc_pct",
    "Dc/0/Voltage": "voltage_v",
    "Dc/0/Current": "current_a",
    "Dc/0/Power": "power_w",
    "Dc/0/Temperature": "temp_c",
    "System/MinCellVoltage": "cell_min_v",
    "System/MaxCellVoltage": "cell_max_v",
}

values = {}
portal = {"id": None}

dest = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"batt-pub-{uuid.uuid4().hex[:6]}")
dest.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
dest.connect("broker.connectmq.com", 1883, keepalive=60)
dest.loop_start()
dest.publish(f"{PREFIX}/status", "online", qos=1, retain=True)


def gx_connect(client, userdata, flags, reason_code, properties):
    print("Connected to GX:", reason_code)
    client.subscribe("N/+/system/0/Serial")
    client.subscribe("N/+/battery/+/#")


def gx_message(client, userdata, msg):
    parts = msg.topic.split("/")
    if parts[2] == "system" and parts[-1] == "Serial" and portal["id"] is None:
        portal["id"] = parts[1]
        print("Portal ID:", portal["id"])
        client.publish(f"R/{portal['id']}/keepalive", "")
        return
    if parts[2] != "battery":
        return
    path = "/".join(parts[4:])
    if path in PATHS:
        try:
            values[PATHS[path]] = json.loads(msg.payload).get("value")
        except (ValueError, AttributeError):
            pass


def keepalive_loop(client):
    while True:
        if portal["id"]:
            client.publish(f"R/{portal['id']}/keepalive", "")
        time.sleep(30)


gx = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=f"batt-gx-{uuid.uuid4().hex[:6]}")
gx.on_connect = gx_connect
gx.on_message = gx_message
gx.connect(GX_HOST, 1883, keepalive=60)
gx.loop_start()
threading.Thread(target=keepalive_loop, args=(gx,), daemon=True).start()

print("Publishing to", PREFIX)
while True:
    time.sleep(PUBLISH_EVERY)
    if not values:
        continue
    out = dict(values)
    if out.get("cell_min_v") is not None and out.get("cell_max_v") is not None:
        out["cell_spread_mv"] = round((out["cell_max_v"] - out["cell_min_v"]) * 1000)
    out["ts"] = int(time.time())
    dest.publish(f"{PREFIX}/telemetry", json.dumps(out), qos=1, retain=True)
    print(out)

Sonucu izleyin:

mosquitto_sub -h broker.connectmq.com -p 1883 -i batt-view-3318 -t "connectmq/demo/+/battery/#" -v
{"soc_pct": 63.4, "voltage_v": 52.71, "current_a": -18.2, "power_w": -959,
 "temp_c": 21.0, "cell_min_v": 3.291, "cell_max_v": 3.304, "cell_spread_mv": 13, "ts": 1760611200}

Negatif akım ve güç, bataryanın deşarj olduğu anlamına gelir. Panoların ve otomasyonların özel durumlara ihtiyaç duymaması için bu işaret kuralını tüm kaynaklarda tutarlı tutun.

Gürültüsüz Ev Bataryası İzleme Uyarıları

SoC eşik civarında gezinirken her on saniyede bir tetiklenen bir düşük batarya uyarısı, insanlara onu görmezden gelmeyi öğretir. Histerezis (uyarıyı başlatmak ve temizlemek için farklı eşikler) kullanın ve her ölçümü değil, yalnızca uyarı geçişlerini yayınlayın:

import json
import paho.mqtt.client as mqtt

TELEMETRY = "connectmq/demo/<your-id>/battery/house/telemetry"
ALERTS = "connectmq/demo/<your-id>/battery/house/alerts"

RULES = {
    # ad: (alan, başlatma_koşulu, temizleme_koşulu)
    "low_soc": ("soc_pct", lambda v: v < 20, lambda v: v > 25),
    "cell_imbalance": ("cell_spread_mv", lambda v: v > 50, lambda v: v < 30),
    "cold_battery": ("temp_c", lambda v: v < 5, lambda v: v > 8),
    "hot_battery": ("temp_c", lambda v: v > 45, lambda v: v < 40),
}
active = set()


def on_connect(client, userdata, flags, reason_code, properties):
    client.subscribe(TELEMETRY, qos=1)


def on_message(client, userdata, msg):
    data = json.loads(msg.payload)
    for name, (field, raise_if, clear_if) in RULES.items():
        v = data.get(field)
        if v is None:
            continue
        if name not in active and raise_if(v):
            active.add(name)
            client.publish(ALERTS, json.dumps({"alert": name, "state": "raised", field: v}), qos=1)
        elif name in active and clear_if(v):
            active.discard(name)
            client.publish(ALERTS, json.dumps({"alert": name, "state": "cleared", field: v}), qos=1)


c = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="batt-alerts-9902")
c.on_connect = on_connect
c.on_message = on_message
c.connect("broker.connectmq.com", 1883, keepalive=60)
c.loop_forever()

Node-RED veya Home Assistant gibi bildirim gönderebilen her şey uyarı topic'ine abone olabilir ve onu telefonunuza iletebilir. Basit tek değerli eşikler için ConnectMQ portalı da bir uyarı günlüğüyle birlikte eşik uyarı kuralları sunar; bu, kendi betiğinizi çalıştırmadan "SoC 20'nin altında" kuralını karşılar. Yukarıdaki histerezis mantığı ise ihtiyaç duyduğunuzda eklediğiniz şeydir.

Hücre farkını dinlenme halinde veya hafif yük altında ölçün. Yoğun şarj ya da deşarj sırasında ve şarjın üst ucuna yakın LiFePO4 hücreleri doğal olarak daha fazla ayrışır; bu nedenle bu dönemlerdeki bir dengesizlik uyarısı mutlaka bir arıza anlamına gelmez.

Batarya Davranışını Zaman İçinde Grafiklemek

Canlı değerler "batarya şu anda ne kadar dolu" sorusunu, geçmiş ise "batarya hâlâ sağlıklı mı" sorusunu yanıtlar. Broker yalnızca en son retained mesajı tuttuğu için telemetriyi InfluxDB'ye yazan Telegraf, Home Assistant'ın kaydedicisi (recorder) veya SQLite'a yazan küçük bir betik gibi bir aboneyle saklayın. Üç grafik hızla karşılığını verir:

  • Aynı zaman ekseninde PV ve şebeke gücüyle birlikte SoC; bataryanın akşam yükünüz için doğru boyutlandırılıp boyutlandırılmadığını gösterir.
  • Günlük minimum SoC; mevsimsel açıkları ve bir rezerv ayarının çok yüksek ya da çok düşük olup olmadığını ortaya koyar.
  • Aylar boyunca dinlenme halindeki hücre farkı; LiFePO4 paketler için uzun vadeli sağlık göstergesidir. Yavaş bir yükseliş eğilimi, dengeleme ayarlarını kontrol etmeniz veya tedarikçiyle iletişime geçmeniz için bir işarettir.

Sorun Giderme Kontrol Listesi

  1. GX cihazından mesaj gelmiyor mu? MQTT on LAN'ın etkin olduğunu ve bağlandıktan sonra abone olduğunuzu doğrulayın.
  2. Değerler bir dakika sonra duruyor mu? Keepalive R/<portal-id>/keepalive adresine ulaşmıyordur; keşfedilen portal ID'sini kontrol edin.
  3. Hücre voltajları eksik mi? BMS'iniz bunları Venus OS'e raporlamıyor olabilir; GX'teki bataryanın cihaz sayfasını kontrol edin.
  4. Tam şarjdan sonra SoC sıçrıyor mu? BMS tahminini yeniden senkronize etmiştir; bu, tam doluluğa ulaşılmayan dönemlerden sonra normaldir.
  5. Panodaki değerler eski mi görünüyor? Retained durum topic'ini kontrol edin; offline diyorsa köprü durmuştur.

Özel Bir Broker'a Geçiş

Batarya verileri evde olduğunuz zamanları ve sisteminizin nasıl yapılandırıldığını gösterir; herkese açık broker ise paylaşımlıdır. Bu yüzden uzun süreli kurulum için özel bir broker kullanın. ConnectMQ gibi tam yönetilen bir MQTT hizmeti, Raspberry Pi'nizdeki köprünün modemde port açmadan dışarıya doğru tek bir TLS bağlantısı kurmasını sağlar. ConnectMQ portalında bir broker oluşturun ve hedef bağlantıyı değiştirin:

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

Buradan sonra batarya verileri, ev enerji izleyiciniz ve EV şarj istasyonunuzla birlikte kararlar alınmasını sağlayabilir; örneğin aracı yalnızca batarya belirli bir SoC'nin üzerindeyken şarj etmek gibi. Broker barındırma seçenekleri için bulut MQTT broker rehberine, daha geniş resim için IoT otomasyon rehberine bakın.

Bataryanızı ConnectMQ ile İzleyin

ConnectMQ; üretilen kimlik bilgileri, canlı bir topic gezgini ve şarj durumu gibi değerler için eşik uyarı kuralları içeren, TLS ile korunan bir MQTT broker sunar. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun ve batarya köprünüzü dakikalar içinde bağlayın.

Sık Sorulan Sorular

Ev bataryaları için iyi bir düşük batarya eşiği nedir?

Birçok LiFePO4 kullanıcısı yaklaşık yüzde 15 ile 20 SoC civarında uyarı başlatır ve birkaç puan yukarıda temizler. Günlük kullanım için batarya üreticinizin minimum SoC önerisine uyun.

Neden yalnızca şarj durumu yerine hücre voltajları izlenmeli?

SoC kayabilen bir tahmindir, hücre voltajları ise doğrudan ölçümdür. En yüksek ve en düşük hücre arasında büyüyen bir fark, dengeleme sorunlarının veya zayıf bir hücrenin erken işaretidir.

Venus OS'in MQTT için internete ihtiyacı var mı?

Hayır. MQTT on LAN tamamen yerel olarak çalışır. Bu rehberdeki köprü verileri yerel olarak okur ve yalnızca seçtiğiniz broker'a dışarıya doğru bir bağlantı kurar.

Victron donanımı olmadan DIY bir bataryayı izleyebilir miyim?

Evet. JK, JBD ve Daly BMS kartları, ESPHome bileşenleri gibi ESP32 firmware'leri tarafından Bluetooth veya UART üzerinden okunabilir; bunlar aynı topic ve uyarı tasarımını kullanarak doğrudan MQTT'ye yayın yapar.

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