Inwerter Volt Polska SINUS PRO ULTRA

Zakupiłem takie cudo ELFIN-EW11 i mam pytanie czy ma ktoś konfiguracje pod modbus lub chciałby pomóc w konfiguracji

A nie chciałbyś w lupce wpisać “elfin” ?

1 polubienie

Sinus pro ultra 10000 48/230 50000/10000w .80AmpptMoc całkowita chwilowa 10000VA Mam pytanko,mam4 baterie po 140ah.Jle mi trzeba podłaczyć Paneli.Dzieki

Hej .
Czy Myślicie że tym sposobem da się odczytać dane z regulatora ładowania SOL MPPT 30A?
Regulator jest od Volt Polska i ma ona protokół komunikacyjny Modbus Communication Protocol V3.9.

Teoretycznie da się wszystko, w praktyce musisz mieć mapę rejestrów uzyskaną od producenta sprzętu, bo metodą “na macanego” spędzisz nad tym miesiące.

Skąd masz takie wiadomości? W danych katalogowych mówią tylko o Bluetooth - nawet jeśli obsługuje modbus to BT stanowi pewien problem.

Robinl30:
Skąd masz takie wiadomości? W danych katalogowych mówią tylko o Bluetooth - nawet jeśli obsługuje modbus to BT stanowi pewien problem.

Trzynasta strona pdf-a.

Czy aby masz właściwą instrukcję lub wspomniany inwerter?

No Masz w linku pierwszego pdf-a i strona 13

A co na to wszystko “producent”, przepraszam importer?

Ok dlatego szukałem źródła, bo w drugim nie było :slight_smile:
Do rzeczy: to tak jak pisał @angler i inni - potrzebne adresy modbus

Na razie spróbuję odczytać rejestry programem Radzia.
Co do adresów to może podejdą te z tąd:

Program Radzia niby coś odbiera ale cały czas jest “error”.

@Pier_pe … ty tu bloga prowadzisz czy o coś pytasz?
Bo nijak nie da się odpowiedzieć na Twoje wpisy.

2 polubienia

Cześć
Czy mógłbyś udostępnić konfigurację bo próbuję zrobić to samo?

Pozdrawiam
Michał

1 polubienie

Testuję działa jest to ten sam klon Pv1800 tylko w w/w integracji zapis jest DEC nie w HEX

Mi też działa z
Inwerter solarny falownik Off Grid z ładowarką solarną MPPT Green Cell 12VDC 1000s

Tylko z taką konfiguracją Modbus

uart:
  id: mod_bus
  tx_pin: GPIO12
  rx_pin: GPIO13
  baud_rate: 19200
  stop_bits: 1

modbus_controller:
  - id: pv1800
    ## the Modbus device addr
    address: 0x4
    command_throttle: 0ms
    setup_priority: -10

Mam sinus pro ultra 2000 udalo mi sie nawiazac polaczenie ale mam dwa klopoty pierwszy jest taki ze nie moge modyfikowac parametrow invertera zmiany sa ignorowane, PV charger ok moge modyfikowac rejestry. Czy mozliwosc rdycji rejestrow trzeba jakims lookbitem odblokowac, czy jest na to jakis myk?

Dwa dni walki, ale są efekty…

Do połączenia użyłem dość korzystnego cenowo modułu ESP32-S3, RS485 i CAN - Waveshare 32154. Cena na dzień dzisiejszy to osiem dyszek. Przychodzi z oprogramowaniem fabrycznym realizującym tylko funkcje testowe, więc krok pierwszy to połączenie przez wbudowane usb i załadowanie podstawowego ESP32.

W pierwszej wersji próbowałem go używać jako zwykły mostek modbus dla HA (korzystałem z wzoru Embedded Garage Polska) ale nie dość że wymagało to częstego restartowania HA, to w dodatku było niestabilne i o ile w ogóle zadzaiłało to potrafiło się wywalić bez ostrzeżenia. Diagnostyka też była upierdliwa postanowiłem więc całą logikę komunikacji po modbus przerzucić na ESP. Uruchomiłem webserwer na esp (choć przy połączeniu z więcej niż jednej przeglądarki ledwo zipie)

esphome:
  name: volt-sinus-ultra-2000
  friendly_name: "Volt Sinus Pro Ultra"

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino            # Zmiana na arduino zapewnia pełną kompatybilność z web_server v2

ota:
  - platform: esphome
  - platform: web_server

api:

# --- WŁĄCZENIE WEBSERVERA ---
web_server:
  port: 80
  version: 2                  

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
# Serwer ESPHome użyje tego IP do wgrywania OTA zamiast adresu .local
  use_address: 192.168.1.133
  
  ap:
    ssid: "Volt-2000-pass-dla-iot"
    password: !secret wifi_password


# Włączenie mDNS, aby można było wejść przez http://volt-sinus-ultra-2000.local
mdns:
  disabled: false

logger:
  level: INFO

uart:
  id: modbus_uart
  tx_pin: GPIO17
  rx_pin: GPIO18
  baud_rate: 19200
  stop_bits: 1
  data_bits: 8
  parity: NONE

modbus:
  id: modbus_hub
  uart_id: modbus_uart
  flow_control_pin: GPIO21   

modbus_controller:
  - id: volt_ultra
    address: 4               
    modbus_id: modbus_hub
    setup_priority: -10
    update_interval: 10s     

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Work State Text"
    id: Sinus2000_work_state_text
    register_type: holding
    address: 25201
    # Dla rejestru 16-bitowego U_WORD potrzebujemy odebrać 2 bajty odpowiedzi
    response_size: 2             
    lambda: |-
      // Składanie dwóch bajtów Modbus w jedną liczbę 16-bitową
      uint16_t state_value = (data[item->offset] << 8) + data[item->offset + 1];
      
      // Mapowanie wartości liczbowej na tekst zgodnie z dokumentacją
      switch (state_value) {
        case 0:  return {"PowerOn"};
        case 1:  return {"SelfTest"};
        case 2:  return {"OffGrid"};
        case 3:  return {"Grid-Tie"};
        case 4:  return {"ByPass"};
        case 5:  return {"Stop"};
        case 6:  return {"Grid charging"};
        default: return {"Unknown state"};
      }

sensor:
  - platform: wifi_signal
    name: "Sygnał Wi-Fi RSSI"
    update_interval: 60s

   # --- OGÓLNE I STATUSY ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Work State"
    id: Sinus2000_work_state
    register_type: holding
    address: 25201
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Voltage"
    id: Sinus2000_battery_voltage
    register_type: holding
    address: 25205           
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1     
    filters:
      - multiply: 0.1   

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Voltage"
    id: Sinus2000_inverter_voltage
    register_type: holding
    address: 25206
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Voltage"
    id: Sinus2000_grid_voltage
    register_type: holding
    address: 25207
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PInverter"
    id: Sinus2000_pinverter
    register_type: holding
    address: 25213
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PGrid"
    id: Sinus2000_pgrid
    register_type: holding
    address: 25214
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PLoad"
    id: Sinus2000_pload
    register_type: holding
    address: 25215
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 0

 # --- TEMPERATURY ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT AC Radiator Temperature"
    id: Sinus2000_ac_radiator_temperature
    register_type: holding
    address: 25233
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Transformer Temperature"
    id: Sinus2000_transformer_temperature
    register_type: holding
    address: 25234
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT DC Radiator Temperature"
    id: Sinus2000_dc_radiator_temperature
    register_type: holding
    address: 25235
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

 # --- ENERGIA SKUMULOWANA (ZASILANIE / ŁADOWANIE / SPRZEDAŻ) ---

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Charger Power High"
    id: Sinus2000_accumulated_charger_power_high
    register_type: holding
    address: 25245
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Charger Power Low"
    id: Sinus2000_accumulated_charger_power_low
    register_type: holding
    address: 25246
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Discharger Power High"
    id: Sinus2000_accumulated_discharger_power_high
    register_type: holding
    address: 25247
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Discharger Power Low"
    id: Sinus2000_accumulated_discharger_power_low
    register_type: holding
    address: 25248
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Buy Power High"
    id: Sinus2000_accumulated_buy_power_high
    register_type: holding
    address: 25249
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Buy Power Low"
    id: Sinus2000_accumulated_buy_power_low
    register_type: holding
    address: 25250
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  # --- DODATKOWE PARAMETRY BATERII I PROTOKOŁU ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Batt Power"
    id: Sinus2000_batt_power
    register_type: holding
    address: 25273
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Batt Current"
    id: Sinus2000_batt_current
    register_type: holding
    address: 25274
    unit_of_measurement: "A"
    device_class: "current"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

number:
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Output Voltage Set"
    id: Sinus2000_set_out_voltage
    register_type: holding
    address: 20102
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 220.0
    max_value: 240.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Output Frequency Set"
    id: Sinus2000_set_out_frequency
    register_type: holding
    address: 20103
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "Hz"
    min_value: 50.00
    max_value: 60.00
    step: 0.01
    multiply: 100

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Max Discharger Current"
    id: Sinus2000_set_max_disch_curr
    register_type: holding
    address: 20113
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 1.0
    max_value: 21.7
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Stop Discharging Voltage"
    id: Sinus2000_set_stop_disch_volt
    register_type: holding
    address: 20118
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 10.5
    max_value: 12.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Stop Charging Voltage"
    id: Sinus2000_set_stop_chg_volt
    register_type: holding
    address: 20119
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 13.6
    max_value: 14.4
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Max Charger Current Set"
    id: Sinus2000_set_grid_max_chg_curr
    register_type: holding
    address: 20125
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 5.0
    max_value: 40.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Low Voltage"
    id: Sinus2000_set_batt_low_volt
    register_type: holding
    address: 20127
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 11.0
    max_value: 12.5
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery High Voltage"
    id: Sinus2000_set_batt_high_volt
    register_type: holding
    address: 20128
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 14.4
    max_value: 15.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Max Combine Charger Current"
    id: Sinus2000_set_max_comb_chg_curr
    register_type: holding
    address: 20132
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 10.0
    max_value: 80.0
    step: 0.1
    multiply: 10

select:
  # --- WŁĄCZNIKI FUNKCJI (Opcje 0: OFF / 1: ON) ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Offgrid Work"
    id: Sinus2000_offgrid_work_enable
    address: 20101
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Search Mode"
    id: Sinus2000_search_mode_enable
    address: 20104
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Discharger To Grid"
    id: Sinus2000_disch_to_grid_enable
    address: 20108
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Solar Power Balance"
    id: Sinus2000_solar_power_balance
    address: 20144
    value_type: U_WORD
    optionsmap:
      "SBD (Disable)": 0
      "SBE (Enable)": 1

  # --- WYBORY ZAAWANSOWANE (SBU, PRIORYTETY ITD.) ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Energy Use Mode"
    id: Sinus2000_energy_use_mode
    address: 20109
    value_type: U_WORD
    optionsmap:
      "SBU": 1
      "SUB": 2
      "UTI": 3
      "SOL": 4

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Protect Standard"
    id: Sinus2000_grid_protect_standard
    address: 20111
    value_type: U_WORD
    optionsmap:
      "VDE4105": 0
      "UPS": 1
      "Home": 2
      "GEN": 3

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT SolarUse Aim"
    id: Sinus2000_solar_use_aim
    address: 20112
    value_type: U_WORD
    optionsmap:
      "LBU / LB": 0
      "BLU / LU": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Charger Source Priority"
    id: Sinus2000_charger_source_priority
    address: 20143
    value_type: U_WORD
    optionsmap:
      "Solar First": 0
      "Solar and Utility": 2
      "Only Solar": 3

  # --- AKCJE SYSTEMOWE ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Remove Accumulated Data"
    id: Sinus2000_remove_accumulated_data
    address: 20213
    value_type: U_WORD
    optionsmap:
      "No action": 0
      "Remove data": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Reset Parameter"
    id: Sinus2000_reset_parameter
    address: 20214
    value_type: U_WORD
    optionsmap:
      "No effect": 0
      "Action Reset": 1

# słowo statusu rozbite na konkretne funkcje
switch:
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142

    # --- BIT 0 ---
    name: "VOLT Forbid Overload Restart"
    id: volt_overload_restart_forbid
    bitmask: 0x0001

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 1 ---
    name: "VOLT Forbid OverTemp Restart"
    id: volt_overtemp_restart_forbid
    bitmask: 0x0002

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 2 ---
    name: "VOLT Forbid Overload Bypass"
    id: volt_overload_bypass_forbid
    bitmask: 0x0004

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 3 ---
    name: "VOLT Forbid Auto Turn Page"
    id: volt_auto_turn_page_forbid
    bitmask: 0x0008

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 4 ---
    name: "VOLT Grid Buzz Enable"
    id: volt_grid_buzz_enable
    bitmask: 0x0010

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 5 ---
    name: "VOLT Forbid Buzzer"
    id: volt_buzz_forbid
    bitmask: 0x0020

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 6 ---
    name: "VOLT LCD Light Enable"
    id: volt_lcd_light_enable
    bitmask: 0x0040

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    register_type: holding
    address: 20142
    
    # --- BIT 7 ---
    name: "VOLT Forbid Record Fault"
    id: volt_record_fault_forbid
    bitmask: 0x0080

Składnia zmienia się co jakiś czas więc wcale nie jest powiedziane że za rok lub dwa przy kolejnej wersji esphome, kod ten skopiowany 1:1 zadziała bez modyfikacji. Trzeba też pamiętać że progi są tu poustawiane dla instalacji 12V aku LFP (dla urządzenia max 2 kW) - przy większych modelach trzeba to poprawić zależnie od instalacji.

Część z sensorów trzeba wywalić bo są potrzebne jak prostytutce pięcioraczki, a generują ruch…

Będę chciał dołożyć tu obsługę innych urządzeń modbus i ciekawy jestem ile ten Waveshare jeszcze wytrzyma, może będzie trzeba wyłączyć webserwer.

Edit:

Okazało się że w poprzedniej wersji był błąd - zmiana wartości jednego z bitów powodowała automatyczne resetowanie pozostałych. Brakowało również strzałek z kierunkami przepływu energii. Poniżej wersja finalna.

esphome:
  name: volt-sinus-ultra-2000
  friendly_name: "Volt Sinus Pro Ultra"
 

esp32:
  board: esp32-s3-devkitc-1
  framework:
    type: arduino            # Zmiana na arduino zapewnia pełną kompatybilność z web_server v2

ota:
  - platform: esphome
  - platform: web_server

api:

# --- WŁĄCZENIE WEBSERVERA ---
web_server:
  port: 80
  version: 2                 # Nowoczesny, responsywny interfejs graficzny w przeglądarce

wifi:
  ssid: !secret wifi_ssid
  password: !secret wifi_password
# Serwer ESPHome użyje tego IP do wgrywania OTA zamiast adresu .local
  use_address: 192.168.10.153
  
  ap:
    ssid: "Volt-2000-pass-dla-iot"
    password: !secret wifi_password


# Włączenie mDNS, aby można było wejść przez http://volt-sinus-ultra-2000.local
mdns:
  disabled: false

logger:
  level: INFO

uart:
  id: modbus_uart
  tx_pin: GPIO17
  rx_pin: GPIO18
  baud_rate: 19200
  stop_bits: 1
  data_bits: 8
  parity: NONE

modbus:
  id: modbus_hub
  uart_id: modbus_uart
  flow_control_pin: GPIO21   

modbus_controller:
  - id: volt_ultra
    address: 4               
    modbus_id: modbus_hub
    setup_priority: -10
    update_interval: 10s     

globals:
  - id: system_settings_shadow
    type: uint16_t
    restore_value: no
    initial_value: '80' # Domyślnie włączone bity 4 i 6 (Stan fabryczny)

text_sensor:
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Work State Text"
    id: Sinus2000_work_state_text
    register_type: holding
    address: 25201
    # Dla rejestru 16-bitowego U_WORD potrzebujemy odebrać 2 bajty odpowiedzi
    response_size: 2             
    lambda: |-
      // Składanie dwóch bajtów Modbus w jedną liczbę 16-bitową
      uint16_t state_value = (data[item->offset] << 8) + data[item->offset + 1];
      
      // Mapowanie wartości liczbowej na tekst zgodnie z dokumentacją
      switch (state_value) {
        case 0:  return {"PowerOn"};
        case 1:  return {"SelfTest"};
        case 2:  return {"OffGrid"};
        case 3:  return {"Grid-Tie"};
        case 4:  return {"ByPass"};
        case 5:  return {"Stop"};
        case 6:  return {"Grid charging"};
        default: return {"Unknown state"};
      }

  - platform: template
    name: "VOLT Battery Flow Direction"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;

      switch ((v >> 6) & 0x03) {
        case 0: return {"Disconnect"};
        case 1: return {"Charging"};
        case 2: return {"Discharging"};
        case 3: return {"Connected"};
      }
      return {"Unknown"};

  - platform: template
    name: "VOLT Grid Flow Direction"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;

      switch ((v >> 8) & 0x03) {
        case 0: return {"Disconnect"};
        case 1: return {"Export"};
        case 2: return {"Import"};
        case 3: return {"Connected"};
      }
      return {"Unknown"};
      
sensor:
  - platform: wifi_signal
    name: "Sygnał Wi-Fi RSSI"
    update_interval: 60s

   # --- OGÓLNE I STATUSY ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Work State"
    id: Sinus2000_work_state
    register_type: holding
    address: 25201
    value_type: U_WORD

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Voltage"
    id: Sinus2000_battery_voltage
    register_type: holding
    address: 25205           
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1     
    filters:
      - multiply: 0.1   

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Voltage"
    id: Sinus2000_inverter_voltage
    register_type: holding
    address: 25206
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Voltage"
    id: Sinus2000_grid_voltage
    register_type: holding
    address: 25207
    unit_of_measurement: "V"
    device_class: "voltage"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PInverter"
    id: Sinus2000_pinverter
    register_type: holding
    address: 25213
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PGrid"
    id: Sinus2000_pgrid
    register_type: holding
    address: 25214
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT PLoad"
    id: Sinus2000_pload
    register_type: holding
    address: 25215
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: U_WORD
    accuracy_decimals: 0

 # --- TEMPERATURY ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT AC Radiator Temperature"
    id: Sinus2000_ac_radiator_temperature
    register_type: holding
    address: 25233
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Transformer Temperature"
    id: Sinus2000_transformer_temperature
    register_type: holding
    address: 25234
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT DC Radiator Temperature"
    id: Sinus2000_dc_radiator_temperature
    register_type: holding
    address: 25235
    unit_of_measurement: "°C"
    device_class: "temperature"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

 # --- ENERGIA SKUMULOWANA (ZASILANIE / ŁADOWANIE / SPRZEDAŻ) ---

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Charger Power High"
    id: Sinus2000_accumulated_charger_power_high
    register_type: holding
    address: 25245
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Charger Power Low"
    id: Sinus2000_accumulated_charger_power_low
    register_type: holding
    address: 25246
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Discharger Power High"
    id: Sinus2000_accumulated_discharger_power_high
    register_type: holding
    address: 25247
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Discharger Power Low"
    id: Sinus2000_accumulated_discharger_power_low
    register_type: holding
    address: 25248
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Buy Power High"
    id: Sinus2000_accumulated_buy_power_high
    register_type: holding
    address: 25249
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 0
    filters:
      - multiply: 1000

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Accumulated Buy Power Low"
    id: Sinus2000_accumulated_buy_power_low
    register_type: holding
    address: 25250
    unit_of_measurement: "kWh"
    device_class: "energy"
    value_type: U_WORD
    accuracy_decimals: 1
    filters:
      - multiply: 0.1

  # --- DODATKOWE PARAMETRY BATERII I PROTOKOŁU ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Batt Power"
    id: Sinus2000_batt_power
    register_type: holding
    address: 25273
    unit_of_measurement: "W"
    device_class: "power"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Batt Current"
    id: Sinus2000_batt_current
    register_type: holding
    address: 25274
    unit_of_measurement: "A"
    device_class: "current"
    state_class: "measurement"
    value_type: S_WORD
    accuracy_decimals: 0

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Raw System Settings"
    id: volt_raw_system_settings
    register_type: holding
    address: 20142
    value_type: U_WORD
    internal: true # Ukrywa surową liczbę w HA, potrzebujemy jej tylko do obliczeń

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Arrow Flag"
    id: Sinus2000_arrow_flag
    register_type: holding
    address: 25279
    value_type: U_WORD
    entity_category: diagnostic

  - platform: template
    name: "VOLT Energy Charged Total"
    id: volt_energy_charged_total
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    lambda: |-
      return id(Sinus2000_accumulated_charger_power_high).state +
             id(Sinus2000_accumulated_charger_power_low).state;

  - platform: template
    name: "VOLT Energy Discharged Total"
    id: volt_energy_discharged_total
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    lambda: |-
      return id(Sinus2000_accumulated_discharger_power_high).state +
             id(Sinus2000_accumulated_discharger_power_low).state;

  - platform: template
    name: "VOLT Energy Imported Total"
    id: volt_energy_imported_total
    unit_of_measurement: "kWh"
    device_class: energy
    state_class: total_increasing
    lambda: |-
      return id(Sinus2000_accumulated_buy_power_high).state +
             id(Sinus2000_accumulated_buy_power_low).state;

binary_sensor:

  - platform: template
    name: "VOLT PV Present"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 0));

  - platform: template
    name: "VOLT Load Present"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 1));

  - platform: template
    name: "VOLT Battery Present"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 2));

  - platform: template
    name: "VOLT Grid Present"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 3));

  - platform: template
    name: "VOLT PV To Machine"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 4));

  - platform: template
    name: "VOLT Machine To Load"
    lambda: |-
      return ((uint16_t)id(Sinus2000_arrow_flag).state & (1 << 5));

  - platform: template
    name: "VOLT Machine To Battery"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;
      return ((v >> 6) & 0x03) == 1;

  - platform: template
    name: "VOLT Battery To Machine"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;
      return ((v >> 6) & 0x03) == 2;

  - platform: template
    name: "VOLT Machine To Grid"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;
      return ((v >> 8) & 0x03) == 1;

  - platform: template
    name: "VOLT Grid To Machine"
    lambda: |-
      uint16_t v = (uint16_t)id(Sinus2000_arrow_flag).state;
      return ((v >> 8) & 0x03) == 2;

number:
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT System Settings Transmitter"
    id: volt_system_settings_transmitter
    register_type: holding
    address: 20142
    value_type: U_WORD
    mode: BOX
    min_value: 0
    max_value: 65535
    step: 1
    internal: true # Ukrywa suwak, sterujemy nim automatycznie

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Output Voltage Set"
    id: Sinus2000_set_out_voltage
    register_type: holding
    address: 20102
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 220.0
    max_value: 240.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Output Frequency Set"
    id: Sinus2000_set_out_frequency
    register_type: holding
    address: 20103
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "Hz"
    min_value: 50.00
    max_value: 60.00
    step: 0.01
    multiply: 100

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Max Discharger Current"
    id: Sinus2000_set_max_disch_curr
    register_type: holding
    address: 20113
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 1.0
    max_value: 21.7
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Stop Discharging Voltage"
    id: Sinus2000_set_stop_disch_volt
    register_type: holding
    address: 20118
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 10.5
    max_value: 12.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Stop Charging Voltage"
    id: Sinus2000_set_stop_chg_volt
    register_type: holding
    address: 20119
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 13.6
    max_value: 14.4
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Max Charger Current Set"
    id: Sinus2000_set_grid_max_chg_curr
    register_type: holding
    address: 20125
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 5.0
    max_value: 40.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery Low Voltage"
    id: Sinus2000_set_batt_low_volt
    register_type: holding
    address: 20127
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 11.0
    max_value: 12.5
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Battery High Voltage"
    id: Sinus2000_set_batt_high_volt
    register_type: holding
    address: 20128
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "V"
    min_value: 14.4
    max_value: 15.0
    step: 0.1
    multiply: 10

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Max Combine Charger Current"
    id: Sinus2000_set_max_comb_chg_curr
    register_type: holding
    address: 20132
    value_type: U_WORD
    mode: BOX
    unit_of_measurement: "A"
    min_value: 10.0
    max_value: 80.0
    step: 0.1
    multiply: 10

select:
  # --- WŁĄCZNIKI FUNKCJI (Opcje 0: OFF / 1: ON) ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Offgrid Work"
    id: Sinus2000_offgrid_work_enable
    address: 20101
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Search Mode"
    id: Sinus2000_search_mode_enable
    address: 20104
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Inverter Discharger To Grid"
    id: Sinus2000_disch_to_grid_enable
    address: 20108
    value_type: U_WORD
    optionsmap:
      "OFF": 0
      "ON": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Solar Power Balance"
    id: Sinus2000_solar_power_balance
    address: 20144
    value_type: U_WORD
    optionsmap:
      "SBD (Disable)": 0
      "SBE (Enable)": 1

  # --- WYBORY ZAAWANSOWANE (SBU, PRIORYTETY ITD.) ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Energy Use Mode"
    id: Sinus2000_energy_use_mode
    address: 20109
    value_type: U_WORD
    optionsmap:
      "SBU": 1
      "SUB": 2
      "UTI": 3
      "SOL": 4

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Grid Protect Standard"
    id: Sinus2000_grid_protect_standard
    address: 20111
    value_type: U_WORD
    optionsmap:
      "VDE4105": 0
      "UPS": 1
      "Home": 2
      "GEN": 3

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT SolarUse Aim"
    id: Sinus2000_solar_use_aim
    address: 20112
    value_type: U_WORD
    optionsmap:
      "LBU / LB": 0
      "BLU / LU": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Charger Source Priority"
    id: Sinus2000_charger_source_priority
    address: 20143
    value_type: U_WORD
    optionsmap:
      "Solar First": 0
      "Solar and Utility": 2
      "Only Solar": 3

  # --- AKCJE SYSTEMOWE ---
  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Remove Accumulated Data"
    id: Sinus2000_remove_accumulated_data
    address: 20213
    value_type: U_WORD
    optionsmap:
      "No action": 0
      "Remove data": 1

  - platform: modbus_controller
    modbus_controller_id: volt_ultra
    name: "VOLT Reset Parameter"
    id: Sinus2000_reset_parameter
    address: 20214
    value_type: U_WORD
    optionsmap:
      "No effect": 0
      "Action Reset": 1

# słowo statusu rozbite na konkretne funkcje

switch:
  # --- BIT 0: Odmowa restartu po przeciążeniu ---
  - platform: template
    name: "VOLT Forbid Overload Restart"
    id: volt_sw_overload_restart_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0001) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0001;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0001;

  # --- BIT 1: Odmowa restartu po przegrzaniu ---
  - platform: template
    name: "VOLT Forbid OverTemp Restart"
    id: volt_sw_overtemp_restart_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0002) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0002;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0002;

  # --- BIT 2: Odmowa przejścia w ByPass przy przeciążeniu ---
  - platform: template
    name: "VOLT Forbid Overload Bypass"
    id: volt_sw_overload_bypass_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0004) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0004;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0004;

  # --- BIT 3: Zakaz automatycznego przewijania stron ekranu (AutoTurnPageForbid) ---
  - platform: template
    name: "VOLT Forbid Auto Turn Page"
    id: volt_sw_auto_turn_page_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0008) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0008;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0008;

  # --- BIT 4: Sygnalizacja dźwiękowa sieci (GridBuzzEnable) ---
  - platform: template
    name: "VOLT Grid Buzz Enable"
    id: volt_sw_grid_buzz_enable
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0010) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0010;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0010;

  # --- BIT 5: Całkowite wyciszenie brzęczyka (BuzzForbide) ---
  - platform: template
    name: "VOLT Forbid Buzzer"
    id: volt_sw_buzz_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0020) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0020;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0020;

  # --- BIT 6: Podświetlenie ekranu LCD ---
  - platform: template
    name: "VOLT LCD Light Enable"
    id: volt_sw_lcd_light_enable
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0040) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0040;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0040;
            
  # --- BIT 7: Zakaz rejestrowania błędów (RecordFaultForbid) ---
  - platform: template
    name: "VOLT Forbid Record Fault"
    id: volt_sw_record_fault_forbid
    lambda: |-
      if (!id(volt_raw_system_settings).has_state()) return false;
      return ((int)id(volt_raw_system_settings).state & 0x0080) != 0;
    turn_on_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val | 0x0080;
    turn_off_action:
      - number.set:
          id: volt_system_settings_transmitter
          value: !lambda |-
            uint16_t current_val = (uint16_t)id(volt_raw_system_settings).state;
            return current_val & ~0x0080;