Sofar Inverterler
Sofar Solar, gunes enerjisi invertorleri ve enerji depolama sistemleri ureten uluslararasi bir firmadır. Zeus 2.0, Sofar'in hibrit ve string invertor serilerini destekler.
Desteklenen Modeller
HYD 3-6K — Hibrit Invertor
Kullanim alani: Konut ve kucuk olcekli ticari tesisler, bataryali sistemler
HYD serisi hibrit invertor, gunes panellerinden (PV) gelen DC gucu AC'ye cevirirken ayni zamanda batarya sarj/desarj yonetimi yapar. Grid, PV, batarya ve yuk arasindaki enerji akisini optimize eder.
Olculen parametreler:
| Kategori | Parametreler |
|---|---|
| PV Verileri | PV voltaj (V), PV akim (A), PV guc (W), gunluk PV uretimi (kWh) |
| Grid Verileri | Grid voltaj (V), grid akim (A), grid gucu (W), grid frekansi (Hz) |
| Batarya | Batarya voltaj (V), batarya akim (A), batarya gucu (W), SoC (%), sarj/desarj durumu |
| Yuk | Yuk gucu (W), gunluk tuketim (kWh) |
| Sistem | Invertor sicakligi, calisma durumu, hata kodlari |
Modbus ayarlari:
| Parametre | Deger |
|---|---|
| Varsayilan Slave ID | 1 |
| Baud Rate | 9600 |
| Data Bits | 8 |
| Parity | None |
| Stop Bits | 1 |
| Protokol | Modbus RTU |
KTLX-G3 — String Invertor
Kullanim alani: Ticari ve endustriyel catı üstü GES (Gunes Enerjisi Santrali) sistemleri
KTLX-G3, cok MPPT girisi olan string invertor serisidir. Sadece PV uretim verilerini okur, batarya yonetimi icermez.
Olculen parametreler:
| Kategori | Parametreler |
|---|---|
| PV Verileri | Her MPPT icin: voltaj (V), akim (A), guc (W) |
| AC Cikis | Voltaj (V), akim (A), guc (W), frekans (Hz) |
| Enerji | Gunluk uretim (kWh), toplam uretim (kWh) |
| Sistem | Invertor sicakligi, calisma durumu, hata kodlari |
Modbus ayarlari:
| Parametre | Deger |
|---|---|
| Varsayilan Slave ID | 1 |
| Baud Rate | 9600 |
| Data Bits | 8 |
| Parity | None |
| Stop Bits | 1 |
| Protokol | Modbus RTU |
Modbus Register Gruplari
Sofar invertorlerin register haritasi asagidaki polling gruplari ile organize edilir:
| Grup | Aralik | Icerik |
|---|---|---|
realtime | 5s | PV voltaj/akim/guc, grid voltaj/akim/guc, batarya durumu |
energy_kwh | 60s | Gunluk/toplam enerji sayaclari |
bms_identity | 24h | Batarya seri numarasi, SoH, kapasite |
fault_status | 10s | Hata kodlari ve uyari bayraklari |
Sofar Fault Map
Sofar invertorlerin hata kodlari asagidaki genel kategorilerde siniflandirilir
(kavramsal ozet — register bazli kesin esleme icin asagidaki "Fault Register
Kapsami" tablosundaki alarm_type sutununa bakin):
| Kategori | Aciklama | Ornek Hatalar |
|---|---|---|
| Grid Fault | Sebeke kaynakli hatalar | Asiri voltaj, dusuk voltaj, frekans sapma, anti-islanding |
| DC / Sampling Fault | PV/DC taraf + ornekleme hatalari | Izolasyon direnci dusuk, ornekleme (grid/DCI/GFCI), PV toprak empedans |
| System Fault | Invertor dahili hatalar | SPI/cip/aux, ark, fan ariza (Fan 1-7), kapatma (zorla/uzaktan/DRMS0/AFCI), yuk dusurme, cikis kisa devre, isitma filmi arizasi |
| Temperature Fault | Sicaklik korumalari | Batarya/radyator/ortam/modul asiri sicaklik, NTC sensor |
| Bus Fault | Bara/gerilim hatalari | Bara dengesizligi/dusuk gerilim, PV/batarya asiri gerilim, fly-span kapasitor |
| Over-current Fault | Asiri akim korumalari | Batarya/DCI/PV/bus asiri akim, EPS kisa devre, rezonans (V1.39, #566) |
| Hardware Fault | Donanim seviyesi hatalar | HW asiri gerilim/akim, sayac iletisim, jenerator, asiri yuk, role kalici ariza (V1.39, #566) |
| Communication Fault | Iletisim arabirimi hatalari | USB/WIFI/BT/RTC/EEPROM/FLASH/SCI, lityum batarya iletisim (V1.39, #566) |
| Battery (BMS) Fault | BMS korumalari + batarya sarj/desarj sicaklik | BMS asiri/dusuk gerilim, yuksek/dusuk sicaklik, asiri akim, kisa devre, CAN surum, PID, PLC heartbeat (V1.39, #567) |
| String Fault | PV string/giris sigorta acik devre | Group string sigorta acik devre 1-1..16-2, giris sigorta acik devre 0-15 (V1.39, #568) |
| DCDC (Battery Converter) Fault | DCDC batarya donusturucu hatalari (HYD-ONLY) | LV/HV gerilim/akim, IGBT/role/izolasyon/topraklama, ARM/PCS/PCU/BMS/DC iletisim, sigorta/precharge/wake-up, fan/sayim/MAC (V1.39 Section 6.3, #571) |
| PCU (Power Conversion Unit) Fault | PCU guc donusum unitesi alarm + hatalari (HYD-ONLY) | Soft-start, fan, radyator/ortam over-temp, bara/batarya SW gerilim/akim, fly-span OV/UV, role kalici ariza, kisa devre, BMS/PWM/pack durum, CBC, cip clock, CAN/SCI iletisim (V1.39 Section 6.4+6.5, #572+#573) |
| BDU (Battery Distribution Unit) Fault | BDU batarya dagitim unitesi hatalari (HYD-ONLY) | Ters batarya baglantisi (yanlis kutuplama), devre arizasi (V1.39 Section 5.9.1, #575) |
NOT (V1.39): Yukaridaki kategoriler kavramsaldir. Gercek
alarm_typedegerleri register bazlidir ve SOFAR V1.39 Section 6.1 icerigine gore atanir:inverter_fault_grid(fc1),inverter_fault_sampling(fc2),inverter_fault_system(fc3, fc8, fc11, fc21, fc25),inverter_fault_temperature(fc4, fc20),inverter_fault_bus(fc5),inverter_fault_overcurrent(fc6),inverter_fault_hardware(fc7, fc9, fc24),inverter_fault_comm(fc10, fc28),inverter_fault_battery(fc12, fc30),inverter_fault_string(fc13, fc14, fc15),inverter_fault_gridayrica fc29,inverter_fault_arc(fc26, fc27),inverter_fault_dcdc(dcdc_fault_1/2/3/9/10 — Section 6.3, HYD-ONLY),inverter_fault_pcu(pcu_alarm_1/2 + pcu_fault_1/2/3 — Section 6.4+6.5, HYD-ONLY),inverter_fault_bdu(bdu_fault_1 — Section 5.9.1, HYD-ONLY),inverter_fault_port_temp(port_temp_1/2 — Section 6.6, HER IKI template). Onceki dokumantasyondaki "DC Fault / Battery Fault / Comm Fault" register eslemeleri eski HYD semasina aitti; #565 PR-2 + #566 PR-3 + #567/#568 + #569 PR-6 + #571 FAZ 3 + #572/#573/#575 FAZ 3 ile guncellendi.inverter_fault_batteryPR-2'de tanimli ama icerigi olmayan (orphan) bir kategoriydi; #567 ile gercek BMS register icerigine baglandi.inverter_fault_string#568,inverter_fault_arc#569,inverter_fault_dcdc#571,inverter_fault_pcu/inverter_fault_bdu#572/#573/#575 ile eklenen yeni kategorilerdir (arc = DC ark, dcdc = batarya donusturucu, pcu = batarya guc donusum, bdu = batarya dagitim = yangin/batarya/kutuplama riski =critical).
Her hata kodu bir bit maskesi olarak register'dan okunur ve template'de tanimli fault map ile insan tarafindan okunabilir metne donusturulur.
Fault Register Kapsami
Onemli (V1.39 hizalama, #565 PR-2): Asagidaki ID araliklari SOFAR Inverter Protocol V1.39 Section 6.1'in global ID semasina gore verilmistir (
ID1-ID76, sifir dolgusuz). Onceki dokumantasyon eski/yanlis bir Sofar HYD fault semasini (ID01-ID60, yerel) referans aliyordu;fault_code_1..fault_code_5bit-bit V1.39'a yeniden yazildi (audit: 36 yanlis-esleme + 31 eksik bit duzeltildi).
| Register | Adres | Fault ID Araligi | alarm_type | Aciklama (V1.39) |
|---|---|---|---|---|
fault_code_1 | 0x0405 | ID1-ID16 | inverter_fault_grid | Sebeke gerilim/frekans/anlik, anti-islanding, anti-backflow |
fault_code_2 | 0x0406 | ID17-ID32 | inverter_fault_sampling | Ornekleme (grid/DCI/GFCI), PID, tutarlilik, notr toprak |
fault_code_3 | 0x0407 | ID33-ID48 | inverter_fault_system | SPI/cip/aux, soft start, ark, izolasyon, topraklama, CT, config |
fault_code_4 | 0x0408 | ID49-ID62 | inverter_fault_temperature | Batarya/radyator/ortam/modul sicaklik, NTC (bit14,15 = ID63,64 N/A) |
fault_code_5 | 0x0409 | ID65-ID76 | inverter_fault_bus | Bara gerilim, PV/batarya asiri gerilim, fly-span kapasitor (bit12-15 = ID77-80 N/A) |
fault_code_6 | 0x040A | ID81-ID96 | inverter_fault_overcurrent | Asiri akim (batarya/DCI/PV/bus), EPS kisa devre, rezonans (V1.39, #566) |
fault_code_7 | 0x040B | ID97-ID112 | inverter_fault_hardware | Donanim asiri gerilim/akim, sayac iletisim, jenerator, asiri yuk (V1.39, #566) |
fault_code_8 | 0x040C | ID113-ID128 | inverter_fault_system | Yuk dusurme (sicaklik/frekans/gerilim), yildirim, batarya, cikis kisa devre (bit6,7,13,14 = ID119,120,126,127 N/A; V1.39, #566) |
fault_code_9 | 0x040D | ID129-ID144 | inverter_fault_hardware | HW asiri akim/gerilim, bus, role kalici ariza, yildirim, sebeke rolesi (V1.39, #566) |
fault_code_10 | 0x040E | ID145-ID160 | inverter_fault_comm | USB/WIFI/BT/RTC/EEPROM/FLASH/SCI, lityum batarya iletisim (V1.39, #566) |
fault_code_11 | 0x040F | ID161-ID176 | inverter_fault_system | Kapatma + fan + isitma filmi hatalari (V1.39, #563) |
fault_code_12 | 0x0410 | ID177-ID192 | inverter_fault_battery | BMS korumalari (asiri/dusuk gerilim, sicaklik, akim, kisa devre), batarya sarj/desarj sicaklik, CAN surum, PID, PLC heartbeat (V1.39, #567) |
fault_code_13 | 0x0411 | ID193-ID208 | inverter_fault_string | Group string sigorta acik devre 1-1..8-2 (V1.39, #568) |
fault_code_14 | 0x0412 | ID209-ID224 | inverter_fault_string | Group string sigorta acik devre 9-1..16-2 (V1.39, #568) |
fault_code_15 | 0x0413 | ID225-ID240 | inverter_fault_string | Giris sigorta acik devre 0-15 (V1.39, #568) |
fault_code_20 | 0x0433 | ID305-ID315 | inverter_fault_temperature | Kontrol unitesi + modul 4-6 + DC/AC port sicaklik (9 aktif; bit6,7 = ID311,312, bit11-15 = ID316-320 N/A; V1.39, #569) |
fault_code_21 | 0x0434 | ID321-ID335 | inverter_fault_system | Faz dizi, anti-kisa-devre, DC role, bus/boost kisa devre (15 aktif; bit15 = ID336 N/A; V1.39, #569) |
fault_code_24 | 0x0437 | ID377-ID384 | inverter_fault_hardware | HW MOS tup, EPS HW asiri akim, AFCI self-check, DC switch trip (8 aktif; bit0-7 = ID369-376 N/A; V1.39, #569) |
fault_code_25 | 0x0438 | ID385-ID386 | inverter_fault_system | HW AD ornekleme bias + Fan 8 (2 aktif; bit2-15 = ID387-400 N/A; V1.39, #569) |
fault_code_26 | 0x0439 | ID401-ID416 | inverter_fault_arc | Ark arizasi 0-15 (16/16 aktif; DC ark = yangin guvenligi; V1.39, #569) |
fault_code_27 | 0x043A | ID417-ID432 | inverter_fault_arc | Ark arizasi 16-31 (16/16 aktif; DC ark = yangin guvenligi; V1.39, #569) |
fault_code_28 | 0x043B | ID433-ID444 | inverter_fault_comm | AFCI iletisim + ARM protokol surum tutarsizligi (6 aktif; bit2-7 = ID435-440, bit12-15 = ID445-448 N/A; V1.39, #569) |
fault_code_29 | 0x043C | ID449-ID463 | inverter_fault_grid | Toprak sifir gerilim, N-line acik, faz kaybi, bus/inverter ornekleme (15 aktif; bit15 = ID464 N/A; V1.39, #569) |
fault_code_30 | 0x043D | ID465-ID478 | inverter_fault_battery | DCDC/BCU/BMU/PID, sarj/desarj MOS, cell, storage (10 aktif; bit4-7 = ID469-472, bit14,15 = ID479,480 N/A; V1.39, #569) |
N/A register'lar:
fault_code_16/fault_code_17/fault_code_18(0x0414-0x0416) vefault_code_19/fault_code_22/fault_code_23(0x0432/0x0435/0x0436) V1.39 Section 6.1'de tamamen N/A'dir (cihaz set etmez) — bu nedenle hic eklenmemistir (false-positive engeli).
fault_code_1..fault_code_5(Issue #565 PR-2): fc1-5 toplam 74 aktif fault flag (16+16+16+14+12). N/A bitler (fc4 bit14,15; fc5 bit12-15) decode edilmez. alarm_type register domain'ine gore atanir (yukaridaki tablo). Severity V1.39 vermez → Zeus is kurali ile atanir (kritiklik bazli; orn. asiri/dusuk gerilim ve izolasyon/topraklamacritical, cogu korumahigh, dusuk-oncelikli uyarilarmedium).
fault_code_6..fault_code_10(Issue #566 PR-3): Bu register'lar onceki decoder'da HIC YOKTU (komple eksik feature); V1.39 Section 6.1'den birebir eklendi — fc6-10 toplam 76 aktif fault flag (16+16+12+16+16). fc8 bit6,7,13,14 (ID119,120,126,127) V1.39'da N/A oldugu icin decode edilmez (false-positive engeli). Iki yenialarm_typetanitildi:inverter_fault_overcurrent(fc6, asiri akim korumalari) veinverter_fault_hardware(fc7+fc9, donanim seviyesi hatalar). fc8 =inverter_fault_system(mevcut kategori), fc10 =inverter_fault_comm(onceden orphan kategori, artik gercek comm icerige baglandi). Severity Zeus is kurali ile atanir (orn. HW asiri akim/gerilim ve EPS kisa devrecritical, cogu korumahigh, dusuk-oncelikli uyarilarmedium).
fault_code_11(Issue #563): SOFAR Modbus V1.39 Section 6.1 ile eklenen kapatma (ID161-164, ID168), fan (ID169-175 = Fan 1-7) ve isitma filmi (ID176) hatalarini icerir. Bit4/bit5/bit6 (ID165-167) V1.39'da N/A oldugu icin decode edilmez (false-positive engeli) — toplam 13 aktif flag. Severity: AFCI zorla kapatmacritical, isitma filmimedium, gerisihigh.
fault_code_12(Issue #567): Bu register onceki decoder'da HIC YOKTU; V1.39 Section 6.1'den birebir eklendi — BMS korumalari (ID177-192, 16/16 aktif flag).alarm_type=inverter_fault_battery(PR-2'de tanimli ama icerigi olmayan orphan kategori artik gercek BMS register icerigine baglandi — comm/fc10 emsali). Severity: BMS asiri/dusuk gerilim, asiri akim, kisa devre, yuksek sicaklik ve batarya sarj/desarj asiri sicaklik =critical(batarya/yangin riski); dusuk sicaklik, surum tutarsizligi, CAN, ark cihaz iletisim, PID, PLC heartbeat =high.
fault_code_13..fault_code_15(Issue #568): Bu register'lar onceki decoder'da HIC YOKTU; V1.39 Section 6.1'den birebir eklendi — PV string/giris sigorta acik devre (ID193-240, 48 aktif flag = 16+16+16). Yenialarm_type=inverter_fault_string. fc13 = group string 1-1..8-2, fc14 = group string 9-1..16-2, fc15 = giris sigorta 0-15. Tum bit'lerhighseverity (sigorta acik devre = uretim kaybi; string/giris devre disi ama acil yangin riski yok).fault_code_16/17/18(0x0414-0x0416) V1.39'da tamamen N/A oldugu icin hic eklenmedi.
fault_code_20..fault_code_30(Issue #569 PR-6): Bu register'lar onceki decoder'da HIC YOKTU; V1.39 Section 6.1'den birebir eklendi — 97 aktif fault flag (9+15+8+2+16+16+6+15+10). Register dagilimi: fc20 (ID305-315) = kontrol unitesi/modul/port sicaklik (inverter_fault_temperature); fc21 (ID321-335) = faz dizi/anti-kisa-devre/DC role/bus-boost kisa devre (inverter_fault_system); fc24 (ID377-384) = HW MOS/EPS/AFCI self-check/DC switch (inverter_fault_hardware); fc25 (ID385-386) = HW AD ornekleme bias
- Fan 8 (
inverter_fault_system— fan kategorisi yok, PR-1 emsali); fc26+fc27 (ID401-432) = ark arizasi 0-31 (yeniinverter_fault_arckategorisi); fc28 (ID433-444) = AFCI iletisim + ARM protokol surum (inverter_fault_comm, fc10 ile birlikte); fc29 (ID449-463) = toprak/N-line/faz kaybi/ornekleme (inverter_fault_grid); fc30 (ID465-478) = DCDC/BCU/BMU/PID/MOS/cell/storage (inverter_fault_battery, fc12 ile birlikte). Yenialarm_type=inverter_fault_arc(DC ark = yangin guvenligi → tum 32 bitcritical). N/A bitler decode edilmez: fc20 bit6,7,11-15; fc21 bit15; fc24 bit0-7; fc25 bit2-15; fc28 bit2-7,12-15; fc29 bit15; fc30 bit4-7,14,15.fault_code_19/22/23(0x0432/0x0435/0x0436) tamamen N/A → hic eklenmedi. Severity Zeus is kurali ile atanir (orn. ark/kisa-devre/MOS/cell/N-line =critical, cogu korumahigh, uyari/surum tutarsizligi =medium).
System Status / Alarm Information (Section 6.2)
SOFAR V1.39 Section 6.2 ("System status / alarm information") register'lari (0x0477-0x047F) cihazin normal isletme durumlari ile gercek arizalari KARISIK tutar (orn. gece calisma, isitma, yuk azaltma, remote control normal durumlardir). Dashboard her cozulen olayi bir ariza-badge'i olarak gosterdigi icin, dashboard'in kirlenmemesi adina yalnizca 15 ariza/shutdown olayi decode edilir (Issue #574 PR-7); normal isletme bit'leri decode EDILMEZ.
| Register | Adres | Decode edilen bit | alarm_type | Aciklama |
|---|---|---|---|---|
status_2 | 0x0478 | bit8-12 (STATUS_25-29) | inverter_fault_system (dashboard-only) | Zorunlu/uzaktan/DRMs0 kapatma, geri besleme iletisim koruma kapatmasi, acil durdurma |
status_3 | 0x0479 | bit3,4,5,11 (STATUS_36,37,38,44) | inverter_fault_system (dashboard-only) | EMS kapatma, AC-bara on sarj hatasi, BMS arizasi, PV sayac iletisimi kesildi |
status_4 | 0x047A | bit0-3 (STATUS_49-52) | inverter_fault_hardware | Boost tup 1-4 arizasi (IGBT donanim; tum bit'ler critical) |
status_7 | 0x047D | bit0,10 (STATUS_97,107) | inverter_fault_system | Izolasyon (ISO) uyarisi, Fan 1 alarmi |
ID namespace ayrimi: System Status olaylari
STATUS_<n>id'siyle gosterilir (orn.STATUS_25); fault register'larininID<n>id'siyle (orn.ID25) CAKISMAZ. i18n etiketleri de AYRI namespace'tedir: System Status icinsofar.status.<n>, fault register'lari icinsofar.fault.<id>. Boylece aynindegeri (orn. 25) iki farkli olayi temsil edebilir (status "Zorunlu kapatma" vs fault "DCI ornekleme hatasi").Yeni
alarm_typeYOK: System Status olaylari mevcutinverter_fault_systemveinverter_fault_hardwarekategorilerini yeniden kullanir; alarm dropdown'una yeni bir kategori eklenmez.status_4(Boost tube/IGBT) →hardware,status_7(ISO + Fan) →systemalarm kategorisine baglidir.status_2/status_3ariza-olaylari dashboard'da gorunur (badge) ancak alarm/bildirim kategorisinde degildir (raw register'da normal isletme bit'leri bulunabilecegi icin register-seviyesi alarm tetiklenmez — dashboard decode'u curated bit-filtre ile calisir).Decode EDILMEYEN register'lar:
status_1/status_5/status_6/status_8/status_9hic decode edilmez (status_1/status_6normal isletme;status_5/status_8/status_9tamamen N/A).status_2bit0-3 (normal isletme),status_3bit1-2/bit7-10 (grid-status + isitma normal) ve tum N/A bit'ler false-positive engeli icin decode dis birakilir.
DCDC Battery Converter Fault (Section 6.3)
SOFAR V1.39 Section 6.3 ("DCDC Battery Converter Fault") register'lari
(0x5065-0x506E) DCDC batarya donusturucu alt-sisteminin hatalarini tasir.
DCDC = batarya alt-sistemi; bu nedenle yalnizca HYD serisi hibrit invertorlerde
bulunur (KTLX string invertorde batarya/DCDC YOKTUR). Toplam 56 aktif fault
(16+16+13+4+7) decode edilir; tum entry'ler yeni inverter_fault_dcdc
kategorisine baglidir (Issue #571 FAZ 3). DCDC donusturucu hatalari batarya/yangin
riski tasidigi icin alarm_type severity'si critical'tir (constants.py).
| Register | Adres | Fault ID Araligi | alarm_type | Aciklama (V1.39 Section 6.3) |
|---|---|---|---|---|
dcdc_fault_1 | 0x5065 | DCDC_1-16 | inverter_fault_dcdc | LV/HV gerilim/akim (SW+HW), fly-span dengesizlik, ARM cip, IGBT surucu, izolasyon, topraklama, role (16/16 aktif) |
dcdc_fault_2 | 0x5066 | DCDC_17-32 | inverter_fault_dcdc | ARM/PCS/PCU1-3/BMS1-3/DC1-6 iletisim, modul asiri sicaklik, sifir kaymasi (16/16 aktif) |
dcdc_fault_3 | 0x5067 | DCDC_33-46 | inverter_fault_dcdc | HV sigorta, LV wake-up, ortam sicaklik, fly-span kapasitor HW, role kisa/acik devre, HV-LV uyumsuzluk, on sarj (13 aktif; bit10 = DCDC_43, bit14,15 = DCDC_47,48 N/A) |
dcdc_fault_9 | 0x506D | DCDC_129-132 | inverter_fault_dcdc | Yazilim surum tutarsizligi, SCI, CAN1 (dahili ag), CAN2 (batarya) iletisim (4 aktif; bit4-15 N/A) |
dcdc_fault_10 | 0x506E | DCDC_145-151 | inverter_fault_dcdc | DCDC/PCU/BMS sayim hatasi, Fan 1-3 alarm (ic/dis), MAC adresi cakismasi (7 aktif; bit7-15 N/A) |
N/A register'lar:
dcdc_fault_4/5/6/7/8(0x5068-0x506C) V1.39 Section 6.3'te tamamen N/A'dir (cihaz set etmez) — hic eklenmemistir (false-positive engeli). Toplam 10 register araliginda yalnizca 5'i decode edilir.ID namespace ayrimi: DCDC olaylari
DCDC_<n>id'siyle gosterilir (orn.DCDC_12); fault register'larininID<n>ve System Status'inSTATUS_<n>id'leriyle CAKISMAZ. i18n etiketleri de AYRI namespace'tedir: DCDC icinsofar.dcdc.<n>, fault register'lari icinsofar.fault.<id>, System Status icinsofar.status.<n>.Yeni
alarm_type=inverter_fault_dcdc: constants.py + engine.py (faultCategoryMapping["dcdc"]= 5 register) + service.py SEVERITY_MAP (critical) 3-dosya lockstep ile tanimlandi. Alarm dropdown'unda "İnvertör DC-DC Donusturucu Arizasi" / "Inverter DC-DC Converter Fault" olarak gorunur (event-driven; cihaz bit-field emit eder, kullanici esik/zaman vermez). Severity: gerilim/akim/IGBT/ izolasyon/topraklama/role/sigorta/modul-sicaklik =critical; iletisim/wake-up/ precharge/sayim/surum =high; ic/dis fan alarmlari =medium.
PCU + BDU Fault (Section 6.4 + 6.5 + 5.9.1)
SOFAR V1.39 Section 6.4 (PCU Alarm) + 6.5 (PCU Fault) + 5.9.1 (BDU Fault)
register'lari batarya moduler alt-sistemini kapsar: PCU = Power Conversion
Unit (guc donusum unitesi), BDU = Battery Distribution Unit (batarya dagitim
unitesi). Her ikisi de batarya alt-sistemine ait oldugu icin yalnizca HYD serisi
hibrit invertorlerde bulunur (KTLX string invertorde PCU/BDU YOKTUR). Toplam
66 aktif fault (PCU 64 + BDU 2) decode edilir; iki yeni alarm_type:
inverter_fault_pcu (5 register) + inverter_fault_bdu (1 register) (Issue
#572 + #573 + #575 FAZ 3). Batarya guc donusum / ters kutuplama / yangin riski
tasidigi icin her iki alarm_type severity'si critical'tir (constants.py).
| Register | Adres | Fault ID Araligi | alarm_type | Aciklama (V1.39) |
|---|---|---|---|---|
pcu_alarm_1 | 0x6024 | PCU_801-815 | inverter_fault_pcu | Sarj/desarj soft-start, Fan 1-4, PCU surum, radyator/ortam over-temp alarm, sarj/desarj yasak, batarya dengesizlik (13 aktif; bit0/11/12 = PCU_800/811/812 N/A) |
pcu_alarm_2 | 0x6025 | PCU_816-819 | inverter_fault_pcu | Bara/batarya asiri/dusuk gerilim alarmi (4 aktif; bit4-15 N/A) |
pcu_fault_1 | 0x6028 | PCU_864-879 | inverter_fault_pcu | Radyator/ortam over-temp koruma, SCI/CAN1/CAN2 iletisim, role 1/3, bara/batarya SW gerilim/akim, fly-span kapasitor OV, HW asiri akim (16/16 aktif) |
pcu_fault_2 | 0x6029 | PCU_880-895 | inverter_fault_pcu | Kalici bara/batarya/akim korumalari, fly-span kapasitor OV/UV, role 1/2 kalici ariza, kisa devre, batarya aktivasyon, BUS ters baglanti (15 aktif; bit12 = PCU_892 N/A) |
pcu_fault_3 | 0x602A | PCU_896-911 | inverter_fault_pcu | Batarya/PWM/BMS durum, BMS OV+OC, ortalama akim/yuk, bara SW akim, CBC, pack id, baslangic kisa devre, cip clock, inverter CAN, radyator/ortam dusuk sicaklik, ornekleme bias (16/16 aktif) |
bdu_fault_1 | 0x609F | BDU_928-929 | inverter_fault_bdu | Ters batarya baglantisi (yanlis kutuplama), devre arizasi (2 aktif; bit2-15 reserve N/A) |
N/A register'lar:
pcu_alarm_3/pcu_alarm_4(0x6026/27) +pcu_fault_4(0x602B) V1.39'da tamamen N/A'dir (cihaz set etmez) — hic eklenmemistir (false-positive engeli).ID namespace ayrimi: PCU olaylari
PCU_<n>(800-911), BDU olaylariBDU_<n>(928-929) id'siyle gosterilir; fault register'larininID<n>, System Status'inSTATUS_<n>ve DCDC'ninDCDC_<n>id'leriyle CAKISMAZ. i18n etiketleri de AYRI namespace'tedir: PCU icinsofar.pcu.<n>, BDU icinsofar.bdu.<n>.Yeni
alarm_type=inverter_fault_pcu+inverter_fault_bdu: constants.py
- engine.py (
faultCategoryMapping["pcu"]= 5 register,["bdu"]= 1 register)- service.py SEVERITY_MAP (her ikisi
critical) 3-dosya lockstep ile tanimlandi. Alarm dropdown'unda "İnvertör PCU (Guc Donusum Unitesi) Arizasi" / "Inverter PCU (Power Conversion Unit) Fault" ve "İnvertör BDU (Batarya Dagitim Unitesi) Arizasi" / "Inverter BDU (Battery Distribution Unit) Fault" olarak gorunur (event-driven; cihaz bit-field emit eder, kullanici esik/zaman vermez). Tum PCU+BDU bit'lericritical(batarya guc donusum / ters kutuplama / yangin riski).
BMS Pack-level Alarm/Protection/Fault (Generic Bitmap — #576)
SOFAR V1.39 Section 5.10.2/3/4 BMS pack-level (paket seviyesi)
alarm/koruma/ariza register'larini kapsar. Bunlar da batarya alt-sistemine ait
oldugu icin yalnizca HYD serisi hibrit invertorlerde bulunur (KTLX string
invertorde YOKTUR). Tek yeni alarm_type: inverter_fault_bms_pack (Issue #576
FAZ 3). BMS = batarya yonetim sistemi oldugu icin severity critical'tir
(constants.py).
⚠️ GENERIC BITMAP — per-bit decode YOK: PCU/BDU/DCDC ve diger fault domain'lerinin aksine, PDF V1.39 bu BMS pack register'larinin bit anlamlarini TANIMLAMAZ (vendor-specific). Bu yuzden backend her bir biti tek tek decode ETMEZ:
decoded_faultsbos kalir, yalnizca rawset_bits(set edilmis bit indeksleri) raporlanir. Alarm mantigi fire-on-non-zero'dur: 9 register'dan herhangi biri sifir-disi olursa tek bir genericinverter_fault_bms_packalarmi acilir.i18n / fault-map sonucu: Per-bit etiket olmadigi icin frontend tarafinda
sofarFaultMapicine hicbir bit entry'si EKLENMEZ vesofar.bmsPack.*namespace'i OLUSTURULMAZ (PCU/BDU'dakisofar.pcu.*/sofar.bdu.*deseninin aksine). Frontend yalnizca alarm dropdown'unda tek bir kategori etiketi gosterir: "İnvertör BMS Paket Arizasi" / "Inverter BMS Pack Fault" (event-driven; cihaz emit eder, kullanici esik/zaman vermez).3-dosya lockstep: constants.py (ALARM_TYPES) + engine.py (
faultCategoryMapping["bms_pack"]= 9 register,any_bit_set) + service.py SEVERITY_MAP (critical).
Port Temperature Detection Fault (#570)
SOFAR V1.39 Section 6.6 port sicaklik tespit ariza register'larini kapsar.
PCU/BDU/DCDC/BMS'in aksine port sicaklik tespiti batarya alt-sistemine ait
DEGILDIR — R/S/T faz sicaklik sensorleri, NTC sensorleri ve PV giris/cikis
port sicaklik sensorleri GENEL inverter ozelligidir. Bu nedenle
inverter_fault_port_temp kategorisi HER IKI template'te bulunur
(SOFAR-HYD-3-6K hibrit ve SOFAR-KTLX-G3 string inverter). Yeni alarm_type:
inverter_fault_port_temp (Issue #570 FAZ 3), severity high (sicaklik arizasi
= ekipman riski; anlik yangin/insan riski seviyesinde DEGIL — dcdc/pcu/bdu
critical'tan farkli).
Bu template sinifi 2-string (PV1-2) oldugu icin yalnizca Fault1 + Fault2 (0x4A41-0x4A42) decode edilir; toplam 22 fault:
| Register | Adres | ID Araligi | Alarm Tipi | Aciklama |
|---|---|---|---|---|
port_temp_1 | 0x4A41 | PORTTEMP_1-11 | inverter_fault_port_temp | R/S/T faz sicaklik arizasi (bit0-2, high) + R/S/T NTC arizasi (bit8-10, medium); 6 aktif (bit3-7 = PORTTEMP_4-8, bit11-15 = PORTTEMP_12-16 N/A) |
port_temp_2 | 0x4A42 | PORTTEMP_17-32 | inverter_fault_port_temp | PV1_1..PV2_4 giris/cikis port sicaklik arizasi (her PV string 4 port x giris/cikis = 8 port x 2 = 16; 16/16 aktif, hepsi high) |
N/A bit kapsama disi: port_temp_1'de yalnizca 6 gercek bit vardir; N/A bitler EKLENMEZ (cihaz set etmez; false-positive riski).
port_temp_3/4/5(0x4A43-0x4A45) PV3-8 portlaridir — bu daha buyuk modellerin AYRI template isidir (2-string sinifi disi) -> decode edilmez.port_temp_6-16(0x4A46-0x4A50) tamamen N/A -> EKLENMEZ.id namespace: Status (Section 6.2) "Alarm ID" 1-144 fault "ID<n>" ile cakistigi gibi, port-temp audit global ID'leri de fault id ile cakisir. Bu yuzden port-temp entry id'leri DISTINCT
PORTTEMP_<n>prefix'i tasir (ID<n>/STATUS_<n>/DCDC_<n>/PCU_<n>/BDU_<n>ile cakismaz). Frontend i18n namespacesofar.porttemp.<n>.Frontend gorunum: Decoded port-temp fault'lari cihaz dashboard'unda fault rozeti olarak gosterilir; alarm dropdown'unda "İnvertör Port Sicaklik Arizasi" / "Inverter Port Temperature Fault" tek kategori olarak secilebilir (event-driven; cihaz bit-field emit eder, kullanici esik/zaman vermez).
3-dosya lockstep: constants.py (ALARM_TYPES) + engine.py (
faultCategoryMapping["port_temp"]=[port_temp_1, port_temp_2],any_bit_set, HER IKI template) + service.py SEVERITY_MAP (high).Polling / aktivasyon: Her iki SOFAR template'ine yeni
port_temppolling grubu eklendi (0x4A41-0x4A42); mevcut gruplar DOKUNULMADI -> canli telemetriye sifir regresyon. Yuksek adres oldugu icin cihaz destegi aktivasyonda dogrulanir (canli rawconfig republish). Cihazda port-temp sensoru yoksa Fault2 gelmeyebilir.
Module State (Enum) Fault (#577)
Onceki tum fault kategorilerinden (fault_code_*, dcdc_fault_*, pcu_*,
bdu_*, bms_*, port_temp_*) farkli olarak Module State arizalari bir
ENUM domain'idir — BITMAP/bit-field DEGIL. Ilgili register tek bir durum
enum'u tasir; deger bir "ariza-durumu" enum'una (orn. recoverable / permanent)
girince alarm acilir. Bu nedenle per-bit decode YOKTUR: decoded_faults bos
kalir, payload yalnizca trigger_field + trigger_value tasir. Frontend tarafinda
bu kategorilerin sofarFaultMap entry'si YOKTUR ve sofar.* fault
namespace'i OLUSTURULMAZ — sadece alarm dropdown'u + alarmType.* i18n etiketi
eklenir.
Engine operatoru enum_fault EDGE-TRIGGERED'dir: register'in mevcut degeri
fault_values listesinde VE bir onceki olcumde DEGIL ise tetiklenir (durum-gecis;
ayni fault-state'te bekleyen cihaz tekrar tekrar tetiklemez). fault_values
listesi template metadata'sindan cozulur (alarmMetadata.moduleStateMapping[category].fault_values);
boylece HYD ve KTLX template'leri ayni alarm_type'i farkli enum esikleriyle
kullanabilir.
alarm_type | Register (field) | Category | Kapsam | Severity |
|---|---|---|---|---|
inverter_module_state | inverter_status | inverter_state | HER IKI template (inverter_status zaten polluyor) | high |
dcdc_module_state | dsp_work_state | dcdc_state | HYD-ONLY | high |
pcu_module_state | pcu_module_state | pcu_state | HYD-ONLY | high |
bms_module_state | bms_current_state_1 | bms_state | HYD-ONLY | high |
inverter_status_faultile ORTUSME yok:inverter_status_fault=("inverter_status", "changed_to", 3)yalniz deger 3'e geciste tetiklenir;inverter_module_state=enum_faultilefault_values(orn. recoverable/ permanent durumlar) girisinde tetiklenir. Ayrialarm_type+ ayri esik → birlikte yasarlar (cakismaz).HYD-ONLY graceful inert:
dcdc/pcu/bms_statekategorileri yalniz HYD template metadata'sinda tanimlidir. KTLX'te (string inverter, batarya yok) bu categorymoduleStateMapping'te bulunmadigi icin_check_enum_faultgracefulFalsedoner — false-positive YOK. KTLX'te yalnizinverter_module_stateaktiftir.3-dosya lockstep: constants.py (ALARM_TYPES — 4 yeni
*_module_state) + engine.py (ALARM_TYPE_FIELD_MAP —enum_faultoperatoru) + service.py SEVERITY_MAP (4 xhigh). Frontend: alarm dropdown'unda "İnvertör/DCDC/PCU/BMS Modul Durum Arizasi" / "Inverter/DC-DC/PCU/BMS Module State Fault" olarak event-driven secilebilir (cihaz enum emit eder; kullanici esik/zaman vermez). Bilincli olaraksofarFaultMap+sofar.*namespace EKLENMEZ (per-bit decode olmadigi icin gosterilecek bit-listesi yok).
Grid Protection Erken Uyari Sistemi
Sofar invertorlerin grid koruma parametreleri izlenerek erken uyari alarmlari olusturulabilir:
| Parametre | Normal Aralik | Uyari Esigi | Aciklama |
|---|---|---|---|
| Grid Voltaj | 220V +/- %10 | 198V veya 242V | Voltaj sinir degerlerine yaklasiyorsa uyari |
| Grid Frekans | 50Hz +/- 0.5Hz | 49.6Hz veya 50.4Hz | Frekans sinir degerlerine yaklasiyorsa uyari |
| Izolasyon Direnci | > 500k ohm | < 100k ohm | Izolasyon direnci duserse PV sistem toprak arizasi riski |
| DC/AC Oranı | < 1.3 | > 1.25 | Asiri clipping olabilir, panel dizilimi kontrolu gerekir |
Bu uyarilar backend alarm sisteminde tanimlanir ve ilgili esikler gecildiginde bildirim gonderilir.
Marka/Model Tespiti
Sofar invertorlerinin dedicated bir marka/model register'i yoktur. Cihaz tespiti, seri numarasindan cikarilir:
- Seri numarasi belirli register araliginda saklanir
- Seri numarasinin ilk karakterleri model ailesini belirtir
- Template eslestirme backend tarafinda seri numarasi parse edilerek yapilir
- Gateway ilk baglantiginda seri numarasini okur ve backend'e bildirir, uygun template otomatik atanir
Ornek: SP2ES... ile baslayan seri numarasi, HYD serisine ait 10kW modelini isaret eder.
Bilinen Tuzaklar
Peak-Shaving Modu
Sofar HYD serisinde peak-shaving (tepe tirpanlama) modu, Modbus register'inda time-sharing mode olarak kodlanmistir ve degeri 2'dir.
Mode Register Degerleri:
0 = Self-use (oz tuketim)
1 = Time-of-use (zaman tarifeli)
2 = Peak-shaving (tepe tirpanlama) ← Dokumanasyonda "time-sharing" olarak gecer
Bu isimlendirme karmasikligi, Sofar'in Cince dokumantasyonunun Ingilizce cevirisinden kaynaklanir. Template ve backend kodunda mode=2 icin peak_shaving etiketi kullanilmalidir.
Register Byte Order
Sofar invertorleri Big Endian (Modbus standardi) byte order kullanir. 32-bit degerler icin register sirasi: [High Word][Low Word].
Batarya Iletisimi
HYD serisinde batarya BMS ile iletisim, invertorün kendi dahili bus'i uzerinden yapilir. Modbus uzerinden sadece invertorun raporladigi batarya degerleri (SoC, voltaj, akim) okunabilir — dogrudan BMS'e Modbus ile erisilemez.
Power Register Kolonlaştırma (Issue #237)
Daha önce Sofar power verileri (PV1/PV2 voltage/current/power, battery voltage/current/SoC/SoH) device_measurements.extra_metadata JSONB kolonu içinde saklanıyordu. Bu yapı sorgu performansını ve continuous aggregate üretimini olumsuz etkiliyordu.
Migration Dizisi
| Migration | İşlem |
|---|---|
| 0031 | device_measurements'a Sofar power kolonları eklendi (nullable) |
| 0032 | extra_metadata JSONB içinden mevcut veri yeni kolonlara backfill edildi |
| 0033 | TimescaleDB continuous aggregate'leri yeni kolonları içerecek şekilde genişletildi |
| 0034 | extra_metadata içinden Sofar power alanları temizlendi (cleanup) |
Bu expand → backfill → contract pattern'i 4 ayrı release'e bölünerek uygulandı; her adım production'da doğrulandıktan sonra bir sonraki adıma geçildi.
Yeni Kolonlar
| Kategori | Alanlar |
|---|---|
| PV1 | sofar_pv1_voltage, sofar_pv1_current, sofar_pv1_power |
| PV2 | sofar_pv2_voltage, sofar_pv2_current, sofar_pv2_power |
| Batarya | sofar_bat_voltage, sofar_bat_current, sofar_bat_soc, sofar_bat_soh |
Dashboard Refactor
Frontend InverterDashboard bileşeni JSONB path query'leri (extra_metadata->>'pv1_power') yerine doğrudan kolon erişimi kullanır. PV/battery/grid SoC chart ayrı bir component'e refactor edildi.
Fault Code Bit-level Decode
Sofar inverter'lar 24 ayrı fault register kullanır (fault_code_1..fault_code_15 0x0405-0x0413; fault_code_20/21/24..30 0x0433-0x043D). Her register 16-bit. Tüm fault tanımları SOFAR Inverter Protocol V1.39 Section 6.1 ile birebir hizalıdır: bit pozisyonları V1.39 global ID şemasına (ID1-ID480, sıfır dolgusuz) karşılık gelir. fault_code_1..fault_code_5 (0x0405-0x0409) global ID1-ID76 aralığını (74 aktif flag); fault_code_6..fault_code_10 (0x040A-0x040E) global ID81-ID160 aralığını (76 aktif flag — asırı akım/donanım/sistem/iletişim); fault_code_11 (0x040F) global ID161-ID176 kapatma/fan/ısıtma filmi hatalarını taşır (Issue #563 saha kanıtı: "Fan 4 Failure" SOFAR app'te görünüyordu ama bu register decode edilmediği için Zeus'ta görünmüyordu); fault_code_12 (0x0410) global ID177-ID192 BMS korumalarını (16 aktif flag, Issue #567); fault_code_13..fault_code_15 (0x0411-0x0413) global ID193-ID240 PV string/giriş sigorta açık devre hatalarını (48 aktif flag, Issue #568); fault_code_20/21/24..30 (0x0433-0x043D) global ID305-ID478 sıcaklık/sistem/donanım/ark/iletişim/şebeke/batarya hatalarını (97 aktif flag, Issue #569 PR-6 — yeni inverter_fault_arc kategorisi dahil) taşır. fault_code_16/17/18 (0x0414-0x0416) ve fault_code_19/22/23 (0x0432/0x0435/0x0436) V1.39'da tamamen N/A olduğu için hiç eklenmemiştir.
V1.39 yeniden yazımı (Issue #565 PR-2):
fault_code_1..fault_code_5önceki dönemde eski/yanlış bir Sofar HYD fault şemasından (ID01-ID60, yerel) alınmıştı. Audit (/tmp/sofar_v139_bitmap_audit.md§1) ile 36 yanlış-eşleme + 31 eksik bit tespit edilip register bazında V1.39'a göre yeniden yazıldı. Eski yerelID01-ID60şeması kaldırıldı; artık tek tip global ID kullanılır (örn.sofar.fault.5= Kaçak akım hatası).
fc6-10 eklendi (Issue #566 PR-3):
fault_code_6..fault_code_10register'ları önceki decoder'da hiç yoktu (komple eksik feature). V1.39 Section 6.1'den birebir eklendi (fc6=aşırı akım, fc7/fc9=donanım, fc8=sistem, fc10=iletişim). İki yenialarm_typetanıtıldı:inverter_fault_overcurrentveinverter_fault_hardware(backendALARM_TYPES). Frontend fault map (sofarFaultMap.ts) ve i18n (sofar.fault.81-sofar.fault.160) backend ile birebir parity tutar.
fc12-15 eklendi (Issue #567 + #568):
fault_code_12..fault_code_15register'ları önceki decoder'da hiç yoktu (komple eksik feature). V1.39 Section 6.1'den birebir eklendi. fc12 (ID177-192) = BMS korumaları (inverter_fault_battery— PR-2'de orphan kalan kategori artık gerçek BMS içeriğe bağlandı). fc13-15 (ID193-240) = PV string/giriş sigorta açık devre (inverter_fault_string— yeni kategori). Frontend fault map (sofarFaultMap.ts) ve i18n (sofar.fault.177-sofar.fault.240, 64 anahtar) backend ile birebir parity tutar.fault_code_16/17/18(0x0414-0x0416) tamamen N/A → eklenmedi.
N/A bitler: V1.39'da tanımsız (N/A) bitler decode edilmez (false-positive alarm riskini önlemek için):
fault_code_4bit14/15 (ID63,64),fault_code_5bit12-15 (ID77-80),fault_code_8bit6/7/13/14 (ID119,120,126,127),fault_code_11bit4/5/6 (ID165-167),fault_code_20bit6/7/11-15,fault_code_21bit15,fault_code_24bit0-7,fault_code_25bit2-15,fault_code_28bit2-7/12-15,fault_code_29bit15,fault_code_30bit4-7/14/15. fc1-5 toplam 74, fc6-10 toplam 76, fc11 toplam 13, fc12 toplam 16, fc13-15 toplam 48, fc20-30 toplam 97 aktif fault flag tanımlıdır (genel toplam 324).fault_code_16/17/18vefault_code_19/22/23register'ları tamamen N/A olduğu için hiç eklenmemiştir.
Fault Map Yapısı
frontend/src/components/device-dashboards/sofar/sofarFaultMap.ts — UI tarafı bit pozisyonu ↔ insan tarafından okunabilir mesaj eşlemesi. Backend (backend/app/features/alarms/sofar_fault_map.py) ile bit/id/name/severity/alarmType birebir parity tutulur:
// SOFAR_FAULT_MAP['fault_code_1'][0]
{
bit: 0,
id: 'ID1', // V1.39 global ID (eski yerel 'ID01' değil)
name: 'GridOVP', // register sembol adı (backend ile aynı)
description: { // i18n etiketi (UI'da çevrilir)
key: 'sofar.fault.1', // konvansiyon: sofar.fault.<global_id>
defaultValue: 'Şebeke aşırı gerilim',
},
severity: 'critical', // critical | high | medium | low
alarmType: 'inverter_fault_grid',
}
i18n key konvansiyonu:
sofar.fault.<global_id>(örn.ID5→sofar.fault.5,ID172→sofar.fault.172,ID240→sofar.fault.240). Tanımlı aralıksofar.fault.1-sofar.fault.240(N/A bit'ler atlanır; ardışık değildir). Tüm anahtarlarfrontend/{src,public}/locales/{tr,en}/common.jsondört dosyada da (TR birincil + EN) tutulur;locale-parity.test.tssentinel'i TR≡EN ve src≡public bütünlüğünü doğrular.
Severity sınıfları (FaultSeverity tipi):
| Severity | Anlam | Örnek |
|---|---|---|
low | Bilgilendirici, müdahale gerekmez | Düşük öncelikli uyarı |
medium | İzlenmeli | PID anormal çıkış, modül sıcaklık farkı |
high | Müdahale gerekli | İzolasyon/topraklama hatası, fan arızası |
critical | Acil müdahale | Şebeke aşırı/düşük gerilim, kaçak akım, batarya aşırı gerilim |
InverterStatusCard Dialog
UI'da fault ID'ye tıklandığında dialog açılır:
- Register adresi (
fault_code_3) - Bit pozisyonu (
bit 7) - Raw değer (
0x0080) - Severity badge (renk kodlu)
- Açıklama (kullanıcı dilinde)
Backend Karşılığı
backend/app/features/alarms/sofar_fault_map.py — backend tarafında alarm değerlendirmesi için kullanılır. Sofar template prefix entegrasyonu Faz 1 ve Faz 2'de tamamlandı. UI ile aynı bit haritasını paylaşır (tek kaynak: JSON template).
BMS Identity Polling (Issue #212)
DeviceBmsIdentity Modeli
Sofar HYD 13 inverter, batarya pack ve cell sayısı, üretici ve kapasite bilgilerini Modbus register grup 5.10.1-5.10.6'da yayınlar.
| Alan | Açıklama |
|---|---|
| BMS Pack count | Bağlı batarya pack sayısı |
| Cell count | Toplam hücre sayısı |
| Manufacturer | Batarya üretici kodu |
| Capacity (Ah) | Nominal kapasite |
| Manufacture date | Üretim tarihi |
| Last polled at | Son okuma zamanı |
Polling Akışı
- Daily auto-check: 04:00 UTC (Celery beat task
bms_identity.daily_check) - Manuel trigger: Backend → MQTT
cmd/read_group→ ESP32 → Modbus okuma → MQTT response → backend update - Audit log: Değişiklik tespit edilirse
device_bms_audit_logappend-only
Detay için bkz. Celery Görevleri.
TLS Heap Corruption Fixes (Issue #215)
ESP32 firmware tarafında Sofar inverter ile uzun süreli iletişim sırasında düşük olasılıkla heap corruption gözlemlendi. Üç ayrı düzeltme uygulandı:
1. mbedtls_ssl_free() Bypass
mbedtls_ssl_free() çağrısı Core 1'de race condition'a sebep oluyordu (TLS context paylaşımı). Çözüm: free işlemi atlandı, context object pool'da yeniden kullanılır. Heap fragmentation Core 1 task döngüsüyle dengelenir.
2. UseInternalTask::NO Konfigürasyonu
ArduinoMQTTClient default olarak internal task spawn eder. Sofar inverter'in kararsız Modbus yanıtları sırasında bu task ile çakışma LoadProhibited exception veriyordu. Çözüm: UseInternalTask::NO ile MQTT loop ana task'a alındı.
3. Shared TLS Client Cleanup
HTTPS sertifika rotasyonu sırasında shared TLS client referansları temizlenmiyordu. Çözüm: rotasyon sonrası weak_ptr::expired() kontrolü ile dangling pointer engellendi.
interval=0 Poll-Once Semantik (Issue #208)
Block group config'inde intervalMs=0 özel anlam taşır: bir kez oku, sonra atla. Bu, kalibrasyon register'ları (CT ratio, BMS identity) ve nadiren değişen yapılandırma değerleri için kullanılır.
Kullanım
{
"groupId": "bms_identity",
"intervalMs": 0,
"blocks": [...]
}
Davranış
- İlk polling döngüsünde okunur
- Sonraki döngülerde atlanır (poll list'te tutulur ama execute edilmez)
- Manuel olarak
cmd/read_groupMQTT komutuyla tetiklenebilir - Daily Celery task ile günlük otomatik refresh
Uygulanan Template'ler
SOFAR-HYD-3-6K—bms_identitygrubu (intervalMs=0)SOFAR-KTLX-G3—static_configgrubu (intervalMs=0)
Pil Verileri Starvation'ı Önleme
Daha önce bms_identity grubu 24 saatte bir okunduğunda (intervalMs=86400000), realtime polling döngüsünde "wait for next interval" mantığı diğer grupları geciktirebiliyordu. intervalMs=0 ile bu grup polling scheduler'dan tamamen çıkarılır; realtime ve fault_status grupları starve olmaz.