MQTT üzerinden güneş inverter izleme, üretim verinizi üreticinin uygulamasından kurtarır ve dashboard'lar, ev otomasyonu ve yük kaydırma mantığı için gerçek zamanlı olarak kullanılabilir hale getirir. Bu eğitimde SunSpec Modbus TCP standardını kullanarak bir inverter'dan güç, enerji ve durum bilgisini Python ile okuyacak, birkaç saniyede bir bir broker'a temiz JSON yayınlayacak ve ilk denemelerin çoğunu tökezleten tuzakları öğreneceksiniz. Yerel HTTP API'leri ve RS485 üzerinden alternatif yollar da ele alınıyor.
Bir Inverter'dan Veri Almanın Üç Yolu
Üretici portalları aylık bir göz atma için yeterlidir, ancak genellikle yavaş güncellenir ve internete bağımlıdır. Yerel erişim daha hızlıdır, çevrimdışı çalışır ve fazla üretimle ısı pompası çalıştırmak gibi otomasyonlar için istediğiniz de budur.
| Yöntem | Tipik inverter'lar | Artıları | Eksileri |
|---|---|---|---|
| SunSpec Modbus TCP | Büyük markaların birçok string inverter'ı | Standart register haritası, yalnızca LAN, hızlı | Çoğu zaman kurulumcu ayarlarından etkinleştirilmesi gerekir |
| Üreticinin yerel HTTP API'si | Bazı markalar LAN üzerinde JSON sunar | Herhangi bir HTTP istemcisiyle kolayca okunur | Üreticiye göre farklıdır, token gerekebilir |
| RS485 üzerinden Modbus RTU | Birçok hibrit ve ekonomik inverter | Ağ portu olmadan çalışır | Bir RS485 adaptörü ve üreticinin register haritası gerekir |
Inverter'ınız destekliyorsa SunSpec en iyi başlangıç noktasıdır, çünkü aynı kod farklı markalarda çalışır. SunSpec Alliance "modeller" tanımlar: sabit düzene sahip register blokları. 101 (tek faz), 102 (split faz) ve 103 (üç faz) inverter modelleri aynı alan düzenini paylaşır ve aşağıdaki kod da buna dayanır.
Inverter'da Modbus TCP'yi Etkinleştirme
Her marka bu ayarı farklı bir yere saklar, ancak kalıp aynıdır:
- Inverter'a bir DHCP rezervasyonuyla sabit bir IP adresi verin.
- Kurulumcu veya devreye alma menüsünde Modbus TCP'yi etkinleştirin (bazen "SunSpec" veya "Modbus slave" olarak geçer).
- Portu (neredeyse her zaman 502) ve unit ID'yi (çoğunlukla 1, bazen 126 veya başka bir değer) not edin.
- Inverter sorarsa SunSpec / float veya int+SF register biçimini seçin; bu rehber en yaygın desteklenen biçim olan tamsayı artı ölçek faktörü biçimini kullanır.
- Inverter'ınızda Modbus için "salt okunur" seçeneği varsa etkinleştirin. Yalnızca okumanız gerekiyor.
Bazı inverter'lar aynı anda yalnızca bir Modbus TCP istemcisini kabul eder. Bir enerji yöneticisi veya şarj ünitesi kontrolcüsü zaten bağlıysa betiğiniz reddedilebilir ya da diğer istemcinin bağlantısını düşürebilir; bu yüzden bağlantının hangi sistemde olacağını önceden planlayın.
SunSpec Register'ları Nasıl Çalışır?
Bir SunSpec cihazı, genellikle 40000 olan bir taban adreste SunS işaretiyle başlar. İşaretin ardından, her biri bir model ID ve uzunlukla başlayan bir model zinciri gelir. Model 101, 102 veya 103'ü bulana kadar zinciri takip eder, ardından alanları sabit ofsetlerden okursunuz:
| Model içindeki ofset | Alan | Tür | Anlamı |
|---|---|---|---|
| 2 | A | uint16 | AC akım, A_SF (ofset 6) ile ölçeklenir |
| 10 | PhVphA | uint16 | A fazı gerilimi, V_SF (ofset 13) ile ölçeklenir |
| 14 | W | int16 | AC güç, W_SF (ofset 15) ile ölçeklenir |
| 16 | Hz | uint16 | Frekans, Hz_SF (ofset 17) ile ölçeklenir |
| 24–25 | WH | acc32 | Wh cinsinden ömür boyu enerji, WH_SF (ofset 26) ile ölçeklenir |
| 31 | DCW | int16 | DC güç, DCW_SF (ofset 32) ile ölçeklenir |
| 33 | TmpCab | int16 | Kabin sıcaklığı, Tmp_SF (ofset 37) ile ölçeklenir |
| 38 | St | enum16 | Çalışma durumu (4 = MPPT, üretim yapıyor) |
Ofsetler model ID register'ından itibaren sayılır. Her değer, 10'un işaretli ölçek faktörü kuvvetiyle çarpılır; yani ham W değeri 51234 ve W_SF -1 ise sonuç 5123,4 W'tır. Uygulanmamış register'lar 0x8000 (işaretli) veya 0xFFFF (işaretsiz) döndürür ve yok sayılmalıdır.
Python Yayıncısı
Kütüphaneleri kurun:
pip install "paho-mqtt>=2.0" "pymodbus>=3.7"
Betik SunSpec tabanını bulur, modelleri dolaşır, inverter bloğunu okur ve JSON yayınlar. Önce ücretsiz public test broker'ını kullanır; bu alan herkes tarafından okunabildiği için rastgele bir önekle.
import json
import time
import uuid
import paho.mqtt.client as mqtt
from pymodbus.client import ModbusTcpClient
INVERTER_IP = "192.168.1.60"
INVERTER_PORT = 502
POLL_SECONDS = 10
PREFIX = f"connectmq/demo/{uuid.uuid4().hex[:8]}/solar/inverter1"
STATE_NAMES = {1: "off", 2: "sleeping", 3: "starting", 4: "mppt",
5: "throttled", 6: "shutting_down", 7: "fault", 8: "standby"}
def s16(v):
return None if v == 0x8000 else (v - 0x10000 if v & 0x8000 else v)
def u16(v):
return None if v == 0xFFFF else v
def scaled(value, sf):
if value is None or sf is None:
return None
return round(value * (10 ** sf), 3)
def kwh(wh_raw, sf):
if not wh_raw or sf is None: # acc32 value 0 means not implemented
return None
return round(wh_raw * (10 ** sf) / 1000, 3)
def find_inverter_model(client):
for base in (40000, 39999, 50000, 0):
rr = client.read_holding_registers(base, count=2)
if rr.isError() or rr.registers != [0x5375, 0x6E53]: # "SunS"
continue
addr = base + 2
for _ in range(30):
rr = client.read_holding_registers(addr, count=2)
if rr.isError():
break
model_id, length = rr.registers
if model_id == 0xFFFF:
break
if model_id in (101, 102, 103):
return addr, length, model_id
addr += 2 + length
raise RuntimeError("No SunSpec inverter model found - check Modbus settings and unit ID")
def read_inverter(client, addr, length):
rr = client.read_holding_registers(addr, count=length + 2)
if rr.isError():
raise IOError(rr)
r = rr.registers
wh_raw = (r[24] << 16) | r[25]
return {
"ac_power_w": scaled(s16(r[14]), s16(r[15])),
"ac_current_a": scaled(u16(r[2]), s16(r[6])),
"ac_voltage_v": scaled(u16(r[10]), s16(r[13])),
"frequency_hz": scaled(u16(r[16]), s16(r[17])),
"energy_total_kwh": kwh(wh_raw, s16(r[26])),
"dc_power_w": scaled(s16(r[31]), s16(r[32])),
"temp_c": scaled(s16(r[33]), s16(r[37])),
"state": STATE_NAMES.get(r[38], str(r[38])),
}
mq = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2,
client_id=f"solar-{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)
mb = ModbusTcpClient(INVERTER_IP, port=INVERTER_PORT, timeout=3)
model_addr = model_len = None
while True:
try:
if not mb.connected:
mb.connect()
if model_addr is None:
model_addr, model_len, model_id = find_inverter_model(mb)
print(f"Found SunSpec model {model_id} at {model_addr}")
data = read_inverter(mb, model_addr, model_len)
data["ts"] = int(time.time())
mq.publish(f"{PREFIX}/telemetry", json.dumps(data), qos=1, retain=True)
print(data)
except Exception as exc:
print("Read failed:", exc)
mb.close()
model_addr = None
time.sleep(POLL_SECONDS)
Inverter'ınız 1 dışında bir unit ID kullanıyorsa, her okumada bunu device_id anahtar kelimesiyle iletin (eski pymodbus sürümlerinde slave olarak geçer). Çıktıyı başka bir makineden izleyin:
mosquitto_sub -h broker.connectmq.com -p 1883 -i solar-viewer-2290 -t "connectmq/demo/+/solar/#" -v
Tipik bir mesaj şöyle görünür:
{"ac_power_w": 4183.0, "ac_current_a": 6.05, "ac_voltage_v": 231.4, "frequency_hz": 50.01,
"energy_total_kwh": 18342.611, "dc_power_w": 4301.0, "temp_c": 41.2, "state": "mppt", "ts": 1760603520}
Güneş Inverter İzlemede Tuzaklar
Sorunların çoğu birkaç nedenden kaynaklanır:
- Bir kayan adresler. Dokümantasyonlar 0 tabanlı ve 1 tabanlı register numaralandırmasını karıştırır. Betiğin hem 40000'i hem 39999'u denemesinin nedeni budur.
- Ölçek faktörleri değişir. Bazı inverter'lar
W_SFdeğerini dinamik olarak değiştirir. Kodun tüm bloğu okuyarak yaptığı gibi, ölçek faktörünü her zaman değerle aynı istekte okuyun. - Gece saatleri. Birçok inverter gece iletişim kartını kapatır veya boş değerlerle "sleeping" durumunu raporlar. Gün batımından sonraki zaman aşımlarını normal kabul edin ve son retained değeri koruyun.
- Sorgulama hızı. Dashboard'lar ve fazla üretim kontrolü için 5 ila 10 saniyede bir yeterlidir. Saniyede birkaç kez sorgulamak hiçbir şey kazandırmaz ve bazı inverter'ları zorlayabilir.
- Sayaç ve inverter farkı. Inverter üretimi bilir; tüketimi veya şebekeye verilen enerjiyi bilmez. Öz tüketim mantığı için bir şebeke sayacına da ihtiyacınız var; bu yarıyı ev enerji izleme rehberi ele alıyor.
- Bataryalı hibrit inverter'lar batarya verilerini çoğu zaman standart SunSpec modelleri yerine üreticiye özgü modellerde sunar. BMS değerlerini yayınlamak için ev bataryası izleme yazısına bakın.
Veriyi Kullanma
Üretim verisi MQTT'ye aktıktan sonra her tüketici, inverter'a bir daha dokunmadan onu kullanabilir. Home Assistant, MQTT entegrasyonu üzerinden JSON'u sensörlere eşleyebilir; Node-RED, üretim bir eşiği aştığında bir akıllı prizi çalıştırabilir; Telegraf ise aylık verim raporları için her şeyi bir zaman serisi veritabanına kaydedebilir. Telemetri mesajı retained olduğu için öğlen açılan bir dashboard mevcut üretimi hemen görür.
Entegrasyonlar bilinçli olarak bu şekilde çalışır: broker merkezdir ve her araç ona bir MQTT istemcisi olarak bağlanır. Fikir size yeniyse, bir MQTT broker'ın ne yaptığına dair genel bakış arkasındaki publish/subscribe modelini açıklıyor.
Özel Bir Broker ile Production'a Geçiş
Güneş verisi parolalar kadar gizli değildir, ancak evde bulunma örüntülerini ve sistem ayrıntılarını ortaya koyar; public broker ise paylaşımlıdır. Kalıcı bir kurulum için yayıncıyı bir Raspberry Pi veya ev sunucusunda çalıştırın ve verileri TLS üzerinden bir bulut MQTT broker'a gönderin. ConnectMQ ile portalda bir broker oluşturun, oluşturulan kimlik bilgilerini kopyalayın ve bağlantı satırları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.will_set("home/solar/inverter1/status", "offline", qos=1, retain=True)
mq.connect("broker.connectmq.com", 8883, keepalive=60)
Bulut broker, Raspberry Pi yalnızca dışa doğru bağlantı kurduğu için ev ağınızda hiçbir şeyi dışarıya açmadan üretimi telefonunuzdan görmenizi de sağlar. Daha kapsamlı IoT otomasyon rehberi, güneş verisinin tüm evin enerji akışlarına nasıl oturduğunu gösteriyor.
Güneş Üretiminizi ConnectMQ ile İzleyin
ConnectMQ; 8883 portunda TLS, tarayıcı dashboard'ları için WebSocket erişimi, canlı topic gezgini ve eşik tabanlı uyarı kuralları sunan yönetilen bir MQTT broker'dır; örneğin bir inverter gün ışığında arıza durumu raporladığında sizi uyarmak için. app.connectmq.com adresinden kredi kartı gerekmeden ücretsiz bir Serverless broker oluşturun.
Sık Sorulan Sorular
Her inverter SunSpec Modbus'ı destekler mi?
Hayır. Köklü string inverter markalarının çoğu destekler, genellikle kurulumcu ayarlarında etkinleştirdikten sonra; bazı hibrit ve ekonomik inverter'lar ise yalnızca üreticiye özgü Modbus RTU haritaları veya bulut API'leri sunar. Modelinizin dokümantasyonunda "SunSpec" ifadesini arayın.
Inverter'ı ne sıklıkla sorgulamalıyım?
Canlı dashboard'lar ve fazla üretime dayalı otomasyonlar için 5 ila 10 saniyede bir yeterlidir. Daha hızlı sorgulama nadiren değer katar ve bazı inverter'lar buna kötü yanıt verir.
Betiğim gece neden başarısız oluyor?
Birçok inverter PV girişi olmadığında iletişim arayüzünü kapatır. Gece zaman aşımlarını beklenen bir durum olarak kabul edin ve son retained MQTT mesajına güvenin.
Inverter'ı MQTT üzerinden kontrol edebilir miyim?
Bazı inverter'lar güç sınırlama için SunSpec kontrol register'larını kabul eder, ancak bir inverter'a yazmak şebeke bağlantı kurallarını ihlal edebilir. Kurulumcunuz neye izin verildiğini teyit etmedikçe bu eğitimi salt okunur tutun.



