# Home Assistant Configuration


# Lovelace dashboards - mode: storage pozwala na UI dashboardy

# Lovelace dashboards - mode: storage pozwala na UI dashboardy
lovelace:
  mode: storage
  resources:
    - url: /hacsfiles/sunsynk-power-flow-card/sunsynk-power-flow-card.js
      type: module
  dashboards:
    lovelace-heating:
      mode: yaml
      title: Ogrzewanie
      icon: mdi:fire
      show_in_sidebar: true
      filename: dashboards/heating_dashboard.yaml
    lovelace-ibsystem:
      mode: yaml
      title: IBSystem
      icon: mdi:heat-pump
      show_in_sidebar: true
      filename: dashboards/ibsystem_dashboard.yaml
    lovelace-salon:
      mode: yaml
      title: Salon
      icon: mdi:sofa
      show_in_sidebar: true
      filename: dashboards/salon_dashboard.yaml

    lovelace-id35:
      mode: yaml
      title: ID35
      icon: mdi:thermometer
      show_in_sidebar: true
      filename: dashboards/id35_dashboard.yaml


homeassistant:
  name: Home
  latitude: 50.0
  longitude: 19.0
  elevation: 200
  unit_system: metric
  time_zone: Europe/Warsaw

# Configure a default setup
default_config:

# Text to speech
tts:
  - platform: google_translate

automation: !include automations.yaml
script: !include scripts.yaml
scene: !include scenes.yaml

# Shell commands
shell_command:
  set_heating_t1s: >
    sshpass -p 'QWer1234' ssh -o StrictHostKeyChecking=no wk@192.168.50.243
    "/ibsystem/ibls -a 127.0.0.1 --pretty -p 2001 -c 'set(rs.0.id.1.setting.t1s={{ value }};);'"

# Template sensors
template:
  - sensor:
      # Temperatura w salonie
      - name: "Temperatura w salonie"
        unique_id: temperatura_salonu_ibsystem
        state: >
          {% set raw = states('sensor.ibsystem_rs0_id4_rs0_id4_input_t_0_value') %}
          {% if raw not in ['unknown', 'unavailable', ''] %}
            {{ (raw | float(0) / 10) | round(1) }}
          {% else %}
            {{ states('sensor.temperatura_w_salonie') | float(23.3) }}
          {% endif %}
        unit_of_measurement: "°C"
        device_class: temperature
        state_class: measurement

      # Różnica temperatury (docelowa - aktualna)
      - name: "Różnica temperatury 2"
        unique_id: roznica_temperatury_2
        state: >
          {% set current = states('sensor.temperatura_w_salonie') | float(22) %}
          {% set target = states('input_number.heating_target_temp') | float(22) %}
          {{ (target - current) | round(1) }}
        unit_of_measurement: "°C"
        state_class: measurement

        
      # Moc aktualna pompy (instantaneous)
      - name: "Moc pompy aktualna"
        unique_id: moc_pompy_aktualna
        state: >
          {% set current = states('sensor.ibsystem_rs0_id1_rs0_id1_outdoor_unit_current') | float(0) %}
          {% set voltage = states('sensor.ibsystem_rs0_id1_rs0_id1_outdoor_unit_voltage') | float(230) %}
          {{ ((current * voltage) / 1000) | round(2) }}
        unit_of_measurement: "kW"
        device_class: power
        state_class: measurement
        
      # COP kalorymetryczny (pomiar rzeczywisty z TW_in/TW_out i przepływu)
      # Sevra Split 8kW: nominalny przepływ 1370 L/h, rejestr water_flow ~62 → 1 unit ≈ 22.1 L/h
      # Formuła: Q_ciepło = flow_lh × 1.163 × (TW_out - TW_in)  COP = Q / P_el
      - name: "COP aktualny"
        unique_id: cop_aktualny_pompy
        state: >
          {% set tw_out = states('sensor.ibsystem_rs0_id1_rs0_id1_tw_out') | float(0) %}
          {% set tw_in  = states('sensor.ibsystem_rs0_id1_rs0_id1_tw_in')  | float(0) %}
          {% set flow   = states('sensor.ibsystem_rs0_id1_rs0_id1_water_flow') | float(0) %}
          {% set cur    = states('sensor.ibsystem_rs0_id1_rs0_id1_outdoor_unit_current') | float(0) %}
          {% set volt   = states('sensor.ibsystem_rs0_id1_rs0_id1_outdoor_unit_voltage') | float(230) %}
          {% set freq   = states('sensor.ibsystem_rs0_id1_rs0_id1_operating_frequency') | int(0) %}
          {% set p_el   = cur * volt %}
          {% set delta_t = tw_out - tw_in %}
          {% set flow_lh = flow * 22.1 %}
          {% if p_el > 50 and freq > 5 and delta_t > 0.3 %}
            {% set q_heat = flow_lh * 1.163 * delta_t %}
            {{ (q_heat / p_el) | round(2) }}
          {% else %}
            0
          {% endif %}
        unit_of_measurement: ""
        state_class: measurement
        icon: mdi:heat-pump

      # Moc cieplna aktualna [W] - z kalorymetrii
      - name: "Moc cieplna pompy"
        unique_id: moc_cieplna_pompy
        state: >
          {% set tw_out = states('sensor.ibsystem_rs0_id1_rs0_id1_tw_out') | float(0) %}
          {% set tw_in  = states('sensor.ibsystem_rs0_id1_rs0_id1_tw_in')  | float(0) %}
          {% set flow   = states('sensor.ibsystem_rs0_id1_rs0_id1_water_flow') | float(0) %}
          {% set freq   = states('sensor.ibsystem_rs0_id1_rs0_id1_operating_frequency') | int(0) %}
          {% set delta_t = tw_out - tw_in %}
          {% set flow_lh = flow * 22.1 %}
          {% if freq > 5 and delta_t > 0.3 %}
            {{ (flow_lh * 1.163 * delta_t) | round(0) | int }}
          {% else %}
            0
          {% endif %}
        unit_of_measurement: "W"
        device_class: power
        state_class: measurement
        icon: mdi:heat-wave

      # SCOP dzienny i miesięczny - z utility_meter (kalorymetryczny)
      - name: "SCOP dzienny"
        unique_id: scop_pompy_dzienny
        state: >
          {% set el = states('sensor.energia_elektryczna_pompy_dzienna') | float(0) %}
          {% set heat = states('sensor.energia_cieplna_dzienna') | float(0) %}
          {% if el > 0.1 %}
            {{ (heat / el) | round(2) }}
          {% else %}
            0
          {% endif %}
        state_class: measurement
        icon: mdi:heat-pump

      - name: "SCOP miesięczny"
        unique_id: scop_pompy_miesieczny
        state: >
          {% set el = states('sensor.energia_elektryczna_pompy_miesieczna') | float(0) %}
          {% set heat = states('sensor.energia_cieplna_miesieczna') | float(0) %}
          {% if el > 0.1 %}
            {{ (heat / el) | round(2) }}
          {% else %}
            0
          {% endif %}
        state_class: measurement
        icon: mdi:heat-pump

      # Licznik defrostów
      - name: "Defrost aktywny"
        unique_id: defrost_status
        state: >
          {% set load = states('sensor.ibsystem_rs0_id1_rs0_id1_load_output') | int(0) %}
          {% set defrost_bit = (load // 32768) % 2 %}
          {{ 'ON' if defrost_bit == 1 else 'OFF' }}
        
      # Eksport do sieci - aktualna moc PV oddawana do sieci
      - name: "Eksport do sieci"
        unique_id: eksport_do_sieci_moc
        state: >
          {% set grid = states('sensor.inverter_deye_grid_power') | float(0) %}
          {{ [(-grid) | round(0) | int, 0] | max }}
        unit_of_measurement: "W"
        device_class: power
        state_class: measurement
        icon: mdi:transmission-tower-export

      # Grid power z odwróconym znakiem dla karty sunsynk (Deye: + = eksport, - = import)
      - name: "Grid Power Sunsynk"
        unique_id: grid_power_sunsynk
        state: >
          {% set grid = states("sensor.inverter_deye_grid_power") | float(0) %}
          {{ (-grid) | round(0) | int }}
        unit_of_measurement: "W"
        device_class: power
        state_class: measurement

      # Pobór z sieci - aktualna moc pobierana z sieci
      - name: "Pobór z sieci"
        unique_id: pobor_z_sieci_moc
        state: >
          {% set grid = states('sensor.inverter_deye_grid_power') | float(0) %}
          {{ [grid | round(0) | int, 0] | max }}
        unit_of_measurement: "W"
        device_class: power
        state_class: measurement
        icon: mdi:transmission-tower-import

  - binary_sensor:
      # Binary sensor defrost
      - name: "Pompa defrost"
        unique_id: pompa_defrost_binary
        state: >
          {{ states('sensor.defrost_aktywny') == 'ON' }}
        device_class: running

# Input number dla celu temperatury
input_number:
  heating_target_temp:
    name: Docelowa temperatura
    initial: 22
    min: 18
    max: 25
    step: 0.5
    unit_of_measurement: "°C"
    icon: mdi:thermometer

# Counter dla liczenia defrostów
counter:
  defrost_count:
    name: Liczba defrostów
    icon: mdi:snowflake-melt
    initial: 0
    step: 1


# Integration sensors - konwertuje moc [W/kW] na energię [kWh]
sensor:
  - platform: integration
    source: sensor.moc_cieplna_pompy
    name: Energia cieplna pompy total
    unique_id: energia_cieplna_pompy_total
    unit_prefix: k
    unit_time: h
    method: trapezoidal
    round: 3

  - platform: integration
    source: sensor.moc_pompy_aktualna
    name: Energia elektryczna pompy total
    unique_id: energia_elektryczna_pompy_total
    unit_time: h
    method: trapezoidal
    round: 3

utility_meter:
  energia_pobrana_dzienna:
    source: sensor.energia_elektryczna_pompy_total
    name: Energia elektryczna pompy (dzienna)
    cycle: daily
    
  energia_pobrana_tygodniowa:
    source: sensor.energia_elektryczna_pompy_total
    name: Energia elektryczna pompy (tygodniowa)
    cycle: weekly
    
  energia_pobrana_miesieczna:
    source: sensor.energia_elektryczna_pompy_total
    name: Energia elektryczna pompy (miesięczna)
    cycle: monthly
    
  energia_oddana_dzienna:
    source: sensor.energia_cieplna_pompy_total
    name: Energia cieplna (dzienna)
    cycle: daily
    
  energia_oddana_tygodniowa:
    source: sensor.energia_cieplna_pompy_total
    name: Energia cieplna (tygodniowa)
    cycle: weekly
    
  energia_oddana_miesieczna:
    source: sensor.energia_cieplna_pompy_total
    name: Energia cieplna (miesięczna)
    cycle: monthly

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - ::1
    - 192.168.50.244
    - 172.16.0.0/12
    - 10.0.0.0/8
    - 192.168.0.0/16
