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



