IoT Otomasyon

SunSpec Modbus ve Python ile MQTT Üzerinden Güneş Enerjisi İnverter İzleme

PV inverter'ınızdan canlı üretim verisini SunSpec Modbus TCP veya yerel bir API üzerinden okuyun; gücü, günlük enerjiyi ve durumu MQTT'ye yayınlayarak güneş verisini evdeki tüm dashboard ve otomasyonlara açın.

Güneş inverter izleme için bulut dashboard'una veri gönderen çatı güneş panelleri ve duvara monte inverter
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

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:

  1. Inverter'a bir DHCP rezervasyonuyla sabit bir IP adresi verin.
  2. Kurulumcu veya devreye alma menüsünde Modbus TCP'yi etkinleştirin (bazen "SunSpec" veya "Modbus slave" olarak geçer).
  3. Portu (neredeyse her zaman 502) ve unit ID'yi (çoğunlukla 1, bazen 126 veya başka bir değer) not edin.
  4. 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.
  5. 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_SF değ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.

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