Elektrikli araç (EV) şarj istasyonu MQTT entegrasyonu, wallbox'ınızın evinizdeki enerji sisteminin geri kalanına dahil olmasını sağlar: güneş parladığında şarj eder, fırın ve ısı pompası çalışırken duraklar ve durumunu diğer her şeyle aynı panoda gösterir. Bu rehber OCPP ile MQTT'nin nasıl farklılaştığını, bir şarj istasyonunu MQTT'ye bağlamanın üç pratik yolunu, düzenli bir topic tasarımını ve Python ile çalışan bir güneş fazlası kontrolcüsünü açıklıyor. Sonunda hangi yolun şarj istasyonunuza uyduğunu ve bunun üzerine nasıl güvenle inşa edeceğinizi bileceksiniz.
OCPP ve MQTT Farklı Sorunları Çözer
İnsanlar sık sık bir şarj istasyonunun OCPP mi yoksa MQTT mi kullanması gerektiğini sorar. Pratikte bu ikisi farklı ilişkilere hizmet eder ve iyi bir ev kurulumu çoğu zaman ikisini birden kullanır.
OCPP (Open Charge Point Protocol), bir şarj istasyonu ile yetkilendirme, oturumlar ve faturalamayı yöneten arka ofis olan Şarj İstasyonu Yönetim Sistemi (CSMS) arasındaki standart dildir. OCPP 1.6J ve 2.0.1, JSON mesajlarını şarj istasyonunun CSMS'e açtığı bir WebSocket üzerinden taşır. Mesajlar arasında BootNotification, StatusNotification, MeterValues, işlem başlatma ve durdurma ile akıllı şarj için SetChargingProfile bulunur. Her şarj istasyonu aynı anda tek bir CSMS'e bağlanır.
MQTT genel amaçlı bir yayınla/abone ol (publish/subscribe) protokolüdür. Bir şarj istasyonu veya köprü durumunu bir broker'a yayınlar ve herhangi sayıda tüketici (pano, Home Assistant, enerji yöneticisi, telefon uygulaması) şarj istasyonu onlardan haberdar olmadan abone olur. Bu model sizin için yeniyse bir MQTT broker'ın ne yaptığına dair açıklama temelleri anlatır.
| Özellik | OCPP | MQTT |
|---|---|---|
| Amaç | Şarj istasyonundan arka ofise: oturumlar, yetkilendirme, faturalama, akıllı şarj | Herhangi bir cihazdan herhangi sayıda tüketiciye |
| Aktarım | WebSocket, şarj istasyonu tek bir CSMS'e bağlanır | Bir broker'a TCP veya WebSocket, çok sayıda abone |
| Mesaj şeması | Her OCPP sürümü için katı biçimde tanımlı | Topic'leri ve payload'ları siz tasarlarsınız |
| Tipik kullanıcı | Şarj noktası operatörleri, filolar, işyeri şarjı | Ev otomasyonu, enerji yönetimi, panolar |
| Kontrol | Uzaktan başlatma/durdurma, şarj profilleri | Cihazın veya köprünün sunduğu her şey |
| Çoklu tüketici | Hayır, bağlantı başına bir CSMS | Evet, yerleşik |
Herkese açık veya işyeri şarj istasyonları işletiyorsanız, bir CSMS'e OCPP doğru temeldir. Ev tipi bir şarj istasyonunun güneş panelleri, bataryalar ve ev yükleriyle iş birliği yapmasını istiyorsanız MQTT pratik entegrasyon katmanıdır; bazen arka planda OCPP ile beslenir.
Bir EV Şarj İstasyonunu MQTT'ye Bağlamanın Üç Yolu
1. Şarj istasyonunda yerleşik MQTT. Bazı şarj istasyonları, özellikle açık donanımlı ve meraklılara yönelik modeller, durumu doğrudan MQTT üzerinden yayınlar ve komutları kabul eder. Broker sunucusunu, portunu ve kimlik bilgilerini şarj istasyonunun web arayüzüne girersiniz. Mevcut olduğunda en basit yol budur, ancak topic adları ve payload'lar üreticiye göre farklılık gösterir.
2. MQTT'ye köprü kuran yerel bir OCPP sunucusu. Birçok ticari wallbox yalnızca OCPP (ve üretici bulutu) konuşur. Şarj istasyonunun OCPP URL'sini, örneğin Home Assistant için OCPP entegrasyonu veya açık kaynaklı bir CSMS gibi yerel bir OCPP sunucusuna yönlendirin ve bu sunucunun durumu ve sayaç değerlerini MQTT'ye yeniden yayınlamasını sağlayın. Standart OCPP anlamını korur, diğer her şey için MQTT kazanırsınız. Bedeli, şarj istasyonu sizin sunucunuzla konuşurken üreticinin kendi bulut özelliklerinin çalışmayı bırakabilmesidir.
3. Arada bir enerji yöneticisi. evcc gibi açık kaynaklı enerji yöneticileri birçok şarj istasyonuyla kendi yerel protokolleri üzerinden konuşur ve şebeke gücü, PV gücü ve şarj noktası başına şarj gücü dahil kendi durumlarını MQTT'ye yayınlar; mod değişikliklerini de MQTT topic'leri üzerinden kabul eder. Kontrol mantığı zaten yazılmış ve test edilmiş olduğu için bu, güneşe duyarlı şarja giden çoğu zaman en hızlı yoldur.
Hangi yolu seçerseniz seçin, broker'da aynı sonucu hedefleyin: şarj istasyonunu değiştirseniz bile değişmeyen kararlı bir topic ağacı.
EV Şarj İstasyonu MQTT Topic Ağacını Tasarlama
Durumu komutlardan ayırın, durumu retained tutun ve komutları asla retained tutmayın:
home/ev/charger1/state retained {"status":"charging","power_w":7210,"current_a":10.4,"phases":3,"session_kwh":12.8}
home/ev/charger1/status retained online / offline (Last Will)
home/ev/charger1/set/current_a command 6..16
home/ev/charger1/set/enabled command true / false
home/energy/grid/telemetry retained {"net_w": -2350, ...}
Kaynak OCPP olmasa bile OCPP tarzı durum değerleri (available, preparing, charging, suspended_ev, suspended_evse, finishing, faulted) kullanın. Bunlar iyi bilinir ve otomasyonlar için önemli olan "araç dolu" (suspended_ev) ile "şarj istasyonu duraklattı" (suspended_evse) durumlarını birbirinden ayırır.
set/current_a gibi bir komutu retained tutmak klasik bir hatadır: bir elektrik kesintisinden sonra şarj istasyonu veya köprü yeniden bağlanır ve eski bir değeri tekrar oynatır. Komutlar retained olmamalıdır; köprü geçerli değeri retained durum topic'inde geri yayınlar.
Python ile Güneş Fazlası Kontrolcüsü
Aşağıdaki kontrolcü, şebeke sayacının net_w değerine (negatif değer, ev enerji izleyici eğitiminde yayınlandığı gibi şebekeye verilen enerji anlamına gelir) ve şarj istasyonu durumuna abone olur, ardından fazlayı takip eden bir şarj akımı yayınlar. Bir topic üzerinden akım ayar noktası kabul eden her şarj istasyonu veya köprüyle çalışır. Gerçek bir şey bağlamadan önce herkese açık broker'da simüle edilmiş mesajlarla test edin.
pip install "paho-mqtt>=2.0"
import json
import time
import paho.mqtt.client as mqtt
PREFIX = "connectmq/demo/ev7k2" # test sırasında kendi rastgele önekinizi kullanın
GRID_TOPIC = f"{PREFIX}/energy/grid/telemetry"
STATE_TOPIC = f"{PREFIX}/ev/charger1/state"
SET_CURRENT = f"{PREFIX}/ev/charger1/set/current_a"
SET_ENABLED = f"{PREFIX}/ev/charger1/set/enabled"
VOLTAGE = 230
PHASES = 1 # üç fazlı şarj istasyonu için 3 yapın
MIN_A, MAX_A = 6, 16 # 6 A, IEC 61851 sinyalleşmesindeki en düşük akımdır
START_MARGIN_W = 300 # başlamadan önce gereken ek şebekeye verilen güç
UPDATE_EVERY = 30 # ayar noktası değişiklikleri arasındaki saniye
STOP_AFTER = 300 # duraklatmadan önce minimumun altında geçen saniye
state = {"net_w": None, "charger_current_a": 0.0, "status": "unknown"}
current_set = 0
below_since = None
last_update = 0.0
def on_connect(client, userdata, flags, reason_code, properties):
print("Connected:", reason_code)
client.subscribe(GRID_TOPIC, qos=1)
client.subscribe(STATE_TOPIC, qos=1)
def on_message(client, userdata, msg):
data = json.loads(msg.payload)
if msg.topic == GRID_TOPIC:
state["net_w"] = data.get("net_w")
elif msg.topic == STATE_TOPIC:
state["charger_current_a"] = data.get("current_a", 0.0)
state["status"] = data.get("status", "unknown")
def control(client):
global current_set, below_since, last_update
if state["net_w"] is None or state["status"] in ("available", "faulted", "unknown"):
return
if time.time() - last_update < UPDATE_EVERY:
return
charger_w = state["charger_current_a"] * VOLTAGE * PHASES
surplus_w = charger_w - state["net_w"] # şebekeden çekmeden kullanabileceğimiz güç
if current_set == 0:
surplus_w -= START_MARGIN_W
target = int(surplus_w // (VOLTAGE * PHASES))
if target >= MIN_A:
below_since = None
target = min(target, MAX_A)
if current_set == 0:
client.publish(SET_ENABLED, "true", qos=1)
if target != current_set:
client.publish(SET_CURRENT, str(target), qos=1)
print(f"surplus {surplus_w:.0f} W -> {target} A")
current_set = target
elif current_set > 0:
below_since = below_since or time.time()
if time.time() - below_since > STOP_AFTER:
client.publish(SET_ENABLED, "false", qos=1)
print("Not enough surplus, pausing")
current_set = 0
elif current_set != MIN_A:
client.publish(SET_CURRENT, str(MIN_A), qos=1)
current_set = MIN_A
last_update = time.time()
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id="ev-surplus-6619")
client.on_connect = on_connect
client.on_message = on_message
client.connect("broker.connectmq.com", 1883, keepalive=60)
client.loop_start()
while True:
control(client)
time.sleep(1)
Başka bir terminalden güneşli bir öğleden sonrayı simüle edin ve kontrolcünün tepkisini izleyin:
mosquitto_pub -h broker.connectmq.com -p 1883 -i ev-sim-1 -t "connectmq/demo/ev7k2/ev/charger1/state" -m '{"status":"suspended_evse","current_a":0}'
mosquitto_pub -h broker.connectmq.com -p 1883 -i ev-sim-2 -t "connectmq/demo/ev7k2/energy/grid/telemetry" -m '{"net_w":-2600}'
Tek fazda 2.600 W şebekeye verilen güçle kontrolcü, başlangıç payını düştükten sonra 10 A ile başlar.
Güvenli Şarj Kontrolü için Tasarım Kuralları
Şarj donanımı saatlerce yüksek akımları taşır; bu yüzden temkinli olun:
- Şarj istasyonunun kendi sınırlarını uygulamasına izin verin. Kontrolcünüz yalnızca bir ayar noktası talep eder; son söz şarj istasyonunun yapılandırılmış maksimum değerinde ve tesisatın koruma elemanlarında kalmalıdır.
- Ayar noktalarını yavaş değiştirin. Sık akım değişiklikleri ve başlat/durdur döngüleri kontaktörleri ve bazı araçları zorlar. 30 saniyelik güncelleme aralığı ve 5 dakikalık durdurma gecikmesi makul başlangıç noktalarıdır.
- 6 A minimumuna uyun. Bunun altında geçersiz bir akım talep etmek yerine şarjı duraklatın.
- Faz geçişlerini dikkatle yönetin. Tek faz ile üç faz arasında geçiş, şarj istasyonunun bunu desteklemesini gerektirir ve akım akarken asla yapılmamalıdır.
- Güvenli duruma geçin. Şebeke sayacı veri göndermeyi bırakırsa ayarlamayı durdurun ve sabit veya duraklatılmış bir duruma dönün. Bunu tespit etmek için sayacın retained Last Will durumunu kullanın.
- Şarj istasyonlarını asla herkese açık bir broker üzerinden kontrol etmeyin. Herkes komut topic'inize yayın yapabilir. Herkese açık alan yalnızca simülasyon içindir.
Özel Bir Broker'a Geçiş
Simülasyon beklendiği gibi çalıştığında gerçek şarj istasyonunu veya köprüyü ve kontrolcüyü TLS'li ve client başına kimlik bilgileri olan özel bir broker'a bağlayın. ConnectMQ gibi yönetilen bir MQTT broker, bakımı gereken bir sunucu olmadan bu broker'ı çevrimiçi tutar; şarj istasyonunuz, sayaç okuyucunuz ve kontrolcünüz yalnızca dışarıya doğru bağlantı kurduğu için modeminizde hiçbir şeyi dışarıya açmanız gerekmez. ConnectMQ portalında bir broker oluşturun, her client için kimlik bilgileri verin ve 8883 portundan bağlanın:
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)
Ardından fazlanın önce araca mı yoksa bataryaya mı gideceğine karar vermek için güneş invertörü izleme ile üretim verilerini, ev bataryası izleme ile depolama verilerini ekleyin. IoT otomasyon rehberi bu enerji akışlarının daha geniş bir ev kurulumuna nasıl oturduğunu gösterir; bulut MQTT broker rehberi de onu nerede barındıracağınızı seçmenize yardımcı olur.
Şarj İstasyonunuzu ConnectMQ'ya Bağlayın
ConnectMQ, şarj istasyonu köprünüze, enerji yöneticinize ve panolarınıza TLS'li özel bir broker, tarayıcı uygulamaları için WebSocket erişimi ve her durum değişikliğini doğrulamak için canlı bir topic gezgini sunar. app.connectmq.com adresinde kredi kartı gerektirmeden ücretsiz bir Serverless broker oluşturun.
Sık Sorulan Sorular
Ev tipi şarj istasyonum OCPP mi yoksa MQTT mi kullanmalı?
Temel bağlantısı için şarj istasyonunun yerel olarak desteklediği yöntemi, ev otomasyonu için ise entegrasyon katmanı olarak MQTT'yi kullanın. Birçok kurulum yerel bir sunucuya OCPP çalıştırır ve MQTT'ye yeniden yayınlar.
OCPP'yi ve üretici bulutunu aynı anda kullanabilir miyim?
Genellikle hayır, çünkü bir şarj istasyonu tek bir OCPP arka ucuna bağlanır. Onu kendi sunucunuza yönlendirmek tipik olarak üreticinin arka ucunun yerini alır; bu nedenle hangi özellikleri kaybedeceğinizi kontrol edin.
Minimum şarj akımı nedir?
AC şarj istasyonlarının kullandığı IEC 61851 kontrol pilot sinyalleşmesinin minimumu 6 A'dir. Bunun altında kontrolcü akımı daha da düşürmek yerine şarjı duraklatmalıdır.
Bir fazla güç kontrolcüsü ne kadar hızlı tepki vermeli?
Her 30 ile 60 saniyede bir mantıklı bir varsayılandır. Daha hızlı tepkiler çoğunlukla geçip giden bulutları kovalar ve gereksiz anahtarlamalara yol açar.



