FVE s podporou z DS

Souhrn tématu

Diskuze se věnuje plánování a realizaci fotovoltaické elektrárny (FVE) s podporou ze sítě (DS), která optimalizuje spotřebu během vysokého a nízkého tarifu. Autor popisuje návrh systému s FV panely a bateriemi, zkušenosti s EASUN bateriemi a jejich správou přes BMS, včetně aktivního balancování článků. Součástí je i integrace do domácí automatizace pomocí ESP32 modulů a esphome, což umožňuje efektivní monitoring a ovládání bateriového systému.
cipis
Moderátor
Příspěvky: 7307
Registrován: pon srp 16, 2021 9:31 pm
Reputace:1029
Lokalita: blízko Brna
Systémové napětí: 24V
Výkon panelů [Wp]: 18+ kWp
Kapacita baterie [kWh]: 40+26
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: blízko Brna

Re: FVE s podporou z DS

Nový příspěvek od cipis »

Hmm, a podělíš se o to PBŘ?
18+ kWp v provozu, 7+ kWp čeká na montáž/zapojení
Regulátory Epever a Victron
MP 24/5000 + Deye mikroinvertory 1+2,25+0,8 kW (můj byt + máti byt)
MP 24/1200 inet, sit, kamery atd.
Phoenix 24/5000 vytěžování do akumulačních kamen
Epever 3kW vytěžování do bojlerů + žebříky
1 kW "nabíječka" 24 V
40+ kWh staré olovo 26+ kWh Li-Ion
několik dalších MP jako záložní zdroje na různých místech
Modře píši jako moderátor, černě jako člen.
rva
Příspěvky: 5032
Registrován: úte dub 23, 2013 10:21 am
Reputace:985
Lokalita: Kousek od Lysé nad Labem
Systémové napětí: 48V
Výkon panelů [Wp]: 46000
Kapacita baterie [kWh]: 62
Chci prodávat energii: NE
Chci/Mám dotaci: NE
Bydliště: Kousek od Lysé nad Labem

Re: FVE s podporou z DS

Nový příspěvek od rva »

Tak už jsou i nějaké zkušenosti s tím EASUN baterry boxem. Články se rozcházejí víc, než u ostatních baterií, které jsem skládal:
Rozbalancování baterie EASUN.png
Rozbalancování baterie EASUN.2.png
Rozbalancování baterie EASUN.2.png (65.31 KiB) Zobrazeno 15 x
. Je vidět, že i větší firmy by se mohly učit od amatérů. Použitá JBD BMS má pouze pasivní balancér (palič) asi 50 mA, zatímco za podobnou cenu by si tam každý svéprávný bastlíř dal JK-BMS s aktivním balancováním alespoň 1A. Uvidím, jestli s tím časem něco udělám.
Do externího boxu jsem přesunul další baterii. Při stěhování jsem mohl přeměřit a zapsat na články jejich vnitřní odpor ( články jsou nabité, protože demontáž a montáž se nejlépe dělá za nabitého stavu, kdy do baterií skoro nic neteče), ještě se to musí učesat, chybí k tomu nějaké komponenty, ale už je zapojená do elektrárny.
2026-08-02 -Vnitřní odpor článků 315 Ah.jpg
Postavena je na vozíku-plošině z LIDL (cca 250 Kč, papírová nosnost 250 kg), ale kolečka jsem po testování vyměnil za jiná (oranžová😃), která jsem vytisk z TPU (neprasknou a jak je model dost hustý, tak mají i pevnost).
2026-08-02 Příprava druhé baterie v boxu.jpg
U baterií dávám sichr pojistku na + pól, tady jsem vyzkoušel z Allegro kompaktní typ:
Pojistka baterie 150A .png
Má zbytečně velký montážní otvor, takže aby dobře seděla na terminálu této baterie, vypodložil jsem to Cu podložkama.
Jo a box je už nějak natřený, aby mu nevadila případná vlhkost a dalo se to utřít. Zavíraný zatím na petlici:
2026-08-02 Box po natření.jpg
2026-08-02 Box po natření.2.jpg
Integrace do HA je přes esphome, kde jsem se vrátil k bezdrátovému řešení - s BMS se komunikuje přes BLE a přes wifi to jde do LAN a HA. Vyhovují mi moduly esp32 C3 s oled displejem. Než se vyřeší nákupy z Číny, tak Poláci jsou schopni to dodat za podobné ceny:
ESP32 C3 OLED.png
Na displeji nechávám rotovat pár základních hodnot - napětí baterie, proud, max. rozdíl napětí mezi články. Komu se nechce to ladit, stačí změnit MAC adresu a mělo by to fungovat:

Kód: Vybrat vše

substitutions:
  name: battery-315ah
  friendly_name: Baterie 315Ah
  device_description: "Monitoruje a nastavuje baterii 315Ah na které je JK-BMS přes ble."
  external_components_source: github://syssi/esphome-jk-bms@main

  # BLE settings
  mac_address: xx:xx:xx:1B:5B:A1
  # Please use "JK02_24S" if you own a old JK-BMS < hardware version 11.0 (hardware version >= 6.0 and < 11.0)
  # Please use "JK02_32S" if you own a new JK-BMS >= hardware version 11.0 (f.e. JK-B2A8S20P hw 11.XW, sw 11.26)
  # Please use "JK04" if you have some old JK-BMS <= hardware version 3.0 (f.e. JK-B2A16S hw 3.0, sw. 3.3.0)
  protocol_version: JK02_32S

esphome:
  name: ${name}
#  name_add_mac_suffix: false
  comment: ${device_description}
  project:
    name: "syssi.esphome-jk-bms"
    version: 2.1.0

esp32:
  variant: esp32c3
  framework:
    type: esp-idf


external_components:
  - source: ${external_components_source}
    refresh: 0s

# Enable logging
logger:

# Enable Home Assistant API
api:
  encryption:
    key: "aQfp2mvgssO74Nf2fLtC8lih6SLXRoKGxViaRFxH3FM="

# Allow Over-The-Air updates
ota:
  platform: esphome
  password: "a4c918a61abbf937b5413b41e91c3823"
  on_begin:
    then:
      - switch.turn_off: ble_client_switch0
      - logger.log: "BLE connection suspended for OTA update"
  
wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
# Optional manual IP
#  manual_ip:
#   static_ip: 192.168.0.70
#  gateway: 192.168.0.1
# subnet: 255.255.255.0
# Enable fallback hotspot (captive portal) in case wifi connection fails
  ap:
    ssid: "battery-315ah"
    password: bxxx-315ah


# V HA se pak k položkám "edit" a "logs" objeví položka "visit", kde se po kliknutí otevře stránka esphome daného zařízení
# To have a "next url" for improv serial
web_server:
  port: 80


# In combination with the `ap` this allows the user
# to provision wifi credentials to the device via WiFi AP.
captive_portal:

i2c:
  - id: bus_a
    sda: GPIO5
    scl: GPIO6
    scan: true  
#    frequency: 10kHz 
#    timeout: 400us   
 
 # Nadefinování několika fontů, ze kterých si budu vybírat pro zobrazení na displeji
font:
  - file: "gfonts://Roboto"
    id: font1
    size: 20

  - file: "gfonts://Material+Symbols+Outlined"
    id: font2
    size: 12

  - file: "gfonts://Material+Symbols+Outlined"
    id: font3
    size: 16

  - file: "gfonts://Material+Symbols+Outlined"
    id: font4
    size: 32

time:
  - platform: homeassistant
    id: esptime
  
#dashboard_import:
#  package_import_url: github://esphome/firmware/esphome-web/esp32c3.yaml@v2
#  import_full_config: true

# Sets up Bluetooth LE (Only on ESP32) to allow the user
# to provision wifi credentials to the device.
#esp32_improv:
#  authorizer: none

esp32_ble_tracker:
  scan_parameters:
    active: false

ble_client:
  - mac_address: ${mac_address}
    id: client0

jk_bms_ble:
  - ble_client_id: client0
    protocol_version: ${protocol_version}
    throttle: 60s
    id: bms0
    # Override the label of one or more error bits (bit 0-31, JK02 only).
    # An empty label suppresses the bit entirely.
    #
    # error_overrides:
    #   4: "Cell overvoltage"
    
binary_sensor:
  - platform: jk_bms_ble
    balancing:
      name: "balancing"
    charging:
      name: "charging"
    discharging:
      name: "discharging"
    heating:
      name: "heating"
    online_status:
      name: "online status"

button:
  - platform: jk_bms_ble
    retrieve_settings:
      name: "retrieve settings"
    retrieve_device_info:
      name: "retrieve device info"
    retrieve_logbook:
      name: "retrieve logbook"

number:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    balance_trigger_voltage:
      name: "balance trigger voltage"
    cell_count:
      name: "cell count"
    total_battery_capacity:
      name: "total battery capacity"
    cell_voltage_overvoltage_protection:
      name: "cell voltage overvoltage protection"
    cell_voltage_overvoltage_recovery:
      name: "cell voltage overvoltage recovery"
    cell_voltage_undervoltage_protection:
      name: "cell voltage undervoltage protection"
    cell_voltage_undervoltage_recovery:
      name: "cell voltage undervoltage recovery"
    balancing_start_voltage:
      name: "balancing start voltage"
    voltage_calibration:
      name: "voltage calibration"
    current_calibration:
      name: "current calibration"
    power_off_voltage:
      name: "power off voltage"
    max_balance_current:
      name: "max balance current"
    max_charge_current:
      name: "max charge current"
    max_discharge_current:
      name: "max discharge current"
    charge_overcurrent_protection_delay:
      name: "charge overcurrent protection delay"
    charge_overcurrent_protection_recovery_time:
      name: "charge overcurrent protection recovery time"
    discharge_overcurrent_protection_delay:
      name: "discharge overcurrent protection delay"
    discharge_overcurrent_protection_recovery_time:
      name: "discharge overcurrent protection recovery time"
    short_circuit_protection_delay:
      name: "short circuit protection delay"
    short_circuit_protection_recovery_time:
      name: "short circuit protection recovery time"
    charge_overtemperature_protection:
      name: "charge overtemperature protection"
    charge_overtemperature_protection_recovery:
      name: "charge overtemperature protection recovery"
    discharge_overtemperature_protection:
      name: "discharge overtemperature protection"
    discharge_overtemperature_protection_recovery:
      name: "discharge overtemperature protection recovery"
    charge_undertemperature_protection:
      name: "charge undertemperature protection"
    charge_undertemperature_protection_recovery:
      name: "charge undertemperature protection recovery"
    mosfet_overtemperature_protection:
      name: "mosfet overtemperature protection"
    mosfet_overtemperature_protection_recovery:
      name: "mosfet overtemperature protection recovery"


sensor:
  - platform: jk_bms_ble
    jk_bms_ble_id: bms0
    min_cell_voltage:
      name: "min cell voltage"
    max_cell_voltage:
      name: "max cell voltage"
    min_voltage_cell:
      name: "min voltage cell"
    max_voltage_cell:
      name: "max voltage cell"
    delta_cell_voltage:
      name: "delta cell voltage"
      id: bms0_delta_cell_voltage
    average_cell_voltage:
      name: "average cell voltage"
    cell_voltage_1:
      name: "cell voltage 1"
    cell_voltage_2:
      name: "cell voltage 2"
    cell_voltage_3:
      name: "cell voltage 3"
    cell_voltage_4:
      name: "cell voltage 4"
    cell_voltage_5:
      name: "cell voltage 5"
    cell_voltage_6:
      name: "cell voltage 6"
    cell_voltage_7:
      name: "cell voltage 7"
    cell_voltage_8:
      name: "cell voltage 8"
    cell_voltage_9:
      name: "cell voltage 9"
    cell_voltage_10:
      name: "cell voltage 10"
    cell_voltage_11:
      name: "cell voltage 11"
    cell_voltage_12:
      name: "cell voltage 12"
    cell_voltage_13:
      name: "cell voltage 13"
    cell_voltage_14:
      name: "cell voltage 14"
    cell_voltage_15:
      name: "cell voltage 15"
    cell_voltage_16:
      name: "cell voltage 16"
    cell_resistance_1:
      name: "cell resistance 1"
    cell_resistance_2:
      name: "cell resistance 2"
    cell_resistance_3:
      name: "cell resistance 3"
    cell_resistance_4:
      name: "cell resistance 4"
    cell_resistance_5:
      name: "cell resistance 5"
    cell_resistance_6:
      name: "cell resistance 6"
    cell_resistance_7:
      name: "cell resistance 7"
    cell_resistance_8:
      name: "cell resistance 8"
    cell_resistance_9:
      name: "cell resistance 9"
    cell_resistance_10:
      name: "cell resistance 10"
    cell_resistance_11:
      name: "cell resistance 11"
    cell_resistance_12:
      name: "cell resistance 12"
    cell_resistance_13:
      name: "cell resistance 13"
    cell_resistance_14:
      name: "cell resistance 14"
    cell_resistance_15:
      name: "cell resistance 15"
    cell_resistance_16:
      name: "cell resistance 16"
    total_voltage:
      name: "total voltage"
      id: bms0_total_voltage
    current:
      name: "current"
      id: bms0_current
    heating_current:
      name: "heating current"
    power:
      name: "power"
    charging_power:
      name: "charging power"
    discharging_power:
      name: "discharging power"
    temperature_sensor_1:
      name: "temperature sensor 1"
    temperature_sensor_2:
      name: "temperature sensor 2"
    # temperature_sensor_3:
    #   name: "temperature sensor 3"
    # temperature_sensor_4:
    #   name: "temperature sensor 4"
    mosfet_temperature:
      name: "mosfet temperature"
    balancer_status_bitmask:
      name: "balancer status bitmask"
    state_of_charge:
      name: "state of charge"
      id: bms0_state_of_charge
    capacity_remaining:
      name: "capacity remaining"
    full_charge_capacity:
      name: "full charge capacity"
    charging_cycles:
      name: "charging cycles"
    total_charging_cycle_capacity:
      name: "total charging cycle capacity"
    total_runtime:
      name: "total runtime"
    power_on_count:
      name: "power on count"
    balancing_current:
      name: "balancing current"


switch:
  - platform: jk_bms_ble
    charging:
      name: "charging"
    discharging:
      name: "discharging"
    balancer:
      name: "balancer"

  - platform: ble_client
    ble_client_id: client0
    name: "enable bluetooth connection"
    id: ble_client_switch0

text_sensor:
  - platform: jk_bms_ble
    errors:
      name: "errors"
    errors_bitmask_hex:
      name: "errors bitmask hex"
    balancer_status:
      name: "balancer status"
    total_runtime_formatted:
      name: "total runtime formatted"
    software_version:
      name: "software version"
    hardware_version:
      name: "hardware version"
    device_model:
      name: "device model"
    manufacturing_date:
      name: "manufacturing date"
    serial_number:
      name: "serial number"

display:
  - platform: ssd1306_i2c
    i2c_id: bus_a
    model: "SSD1306 72x40"
    #reset_pin: D2
    address: 0x3C
#za lambda se píše kód přímo v C. V tomto případě se na displeji střídá několik hodnot 
    lambda: |-
          switch (id(page))
            {
            case 1:
              it.strftime(5, 18, id(font1), TextAlign::BASELINE_LEFT, "%H:%M", id(esptime).now());
              break;
            case 2:
              if (id(bms0_current).has_state()) 
                {
                it.printf(5, 20, id(font1), TextAlign::BASELINE_LEFT , "%.1f A", id(bms0_current).state);
                }
              break;
            case 3:
              if (id(bms0_state_of_charge).has_state()) 
                {
                it.printf(5, 22, id(font1), TextAlign::BASELINE_LEFT , "%.0f %%", id(bms0_state_of_charge).state);      
                }
              break;
            case 4:
              if (id(bms0_total_voltage).has_state()) 
                {
                it.printf(5, 24, id(font1), TextAlign::BASELINE_LEFT , "%.1f V", id(bms0_total_voltage).state);      
                }
              break;
            case 5:
              if (id(bms0_delta_cell_voltage).has_state()) 
                {
                it.printf(5, 26, id(font1), TextAlign::BASELINE_LEFT , "%.0f mV", id(bms0_delta_cell_voltage).state * 1000);      
                }
              break;
          }

globals:
- id: page
  type: int
  initial_value: "1"

# cyklus zajišťující v 1s intervalech zobrazení jednotlivých hodnot
interval:
- interval: 1s
  then:
    - lambda: |-
        id(page) = (id(page) + 1);
        if (id(page) > 5) {
          id(page) = 1;
        }
    
Tyto moduly se akorát vejdou do krabičky podle esp32 C3 oled krabička a pak to vypadá nějak takto:
2026-08-02 Monitorování JK BMS a JBD BMS pomocí EspHome.jpg
Do boxu by měly přejít ještě nějaké baterie a jeden nabíječ pro zimní provoz. Zatím tam je místa dost.
_______________________________________________________________________
43 kWp, LiFePO4 62 kWh,
EPSolar 60 A/150 V ET6415N + 3x Isolar SM II (5 kW, 450 V, 80 A) + Axpert PIP 5048MS

Kdo je online

Uživatelé procházející toto fórum: Claudebot [Bot], Energoraj