diff --git a/ha-configs/151/automations.yaml b/ha-configs/151/automations.yaml index 181ac9a..1537284 100644 --- a/ha-configs/151/automations.yaml +++ b/ha-configs/151/automations.yaml @@ -456,7 +456,12 @@ message: 'SOC: {{ states(''sensor.inverter_deye_battery'') }}%' - alias: Solcast G12W - Włącz ładowanie dzienne 13:00 - description: Ładowanie 13:00-15:00 w dni robocze (G12W tania taryfa) - 100A + id: g12w_wlacz_ladowanie_dzienne + description: > + 12:55: oblicza czy nadmiar PV w oknie 13:00-15:00 wystarczy do naładowania baterii. + Jeśli PV_nadmiar * 2h >= deficyt baterii → Battery First (bez sieci). + Jeśli nie → ładuj z sieci 100A (tania taryfa G12W). + Pojemność baterii: 14336 Wh (280Ah * 51.2V LFP). trigger: - platform: time at: '12:55:00' @@ -470,36 +475,75 @@ - fri - condition: numeric_state entity_id: sensor.inverter_deye_battery - below: 95 + below: 100 action: - - service: switch.turn_on - target: - entity_id: switch.inverter_deye_battery_grid_charging - - service: select.select_option - target: - entity_id: select.inverter_deye_energy_pattern - data: - option: Load First - - service: number.set_value - target: - entity_id: number.inverter_deye_battery_grid_charging_current - data: - value: 100 - # Program 4: 13:00 - Grid - - service: select.select_option - target: - entity_id: select.inverter_deye_program_4_charging - data: - option: Grid - - service: number.set_value - target: - entity_id: number.inverter_deye_program_4_soc - data: - value: 100 - - service: notify.persistent_notification - data: - title: '⚡ G12W: Ładowanie dzienne (100A)!' - message: 'Prognoza: {{ states(''sensor.solcast_pv_forecast_prognoza_na_dzisiaj'') }} kWh, SOC: {{ states(''sensor.inverter_deye_battery'') }}%' + - choose: + # PV nadmiar przez 2h okna >= deficyt baterii → sieć niepotrzebna + - conditions: + - condition: template + value_template: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set bat_deficit_wh = (100 - soc) * 143.36 %} + {% set pv_surplus_2h = (pv - load) * 2 %} + {{ pv_surplus_2h >= bat_deficit_wh and pv > load }} + sequence: + - service: select.select_option + target: + entity_id: select.inverter_deye_energy_pattern + data: + option: Battery First + - service: select.select_option + target: + entity_id: select.inverter_deye_program_4_charging + data: + option: Disabled + - service: notify.persistent_notification + data: + title: '☀️ G12W: PV naładuje baterię bez sieci' + message: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set deficit = ((100 - soc) * 143.36) | round(0) %} + PV: {{ pv }}W, Zużycie: {{ load }}W, Nadmiar: {{ pv - load }}W. + Deficyt baterii: {{ deficit }} Wh. Nadmiar 2h: {{ ((pv - load) * 2) | round(0) }} Wh. SOC: {{ soc }}% + # PV niewystarczające → ładuj z sieci (tania taryfa G12W) + default: + - service: switch.turn_on + target: + entity_id: switch.inverter_deye_battery_grid_charging + - service: select.select_option + target: + entity_id: select.inverter_deye_energy_pattern + data: + option: Load First + - service: number.set_value + target: + entity_id: number.inverter_deye_battery_grid_charging_current + data: + value: 100 + - service: select.select_option + target: + entity_id: select.inverter_deye_program_4_charging + data: + option: Grid + - service: number.set_value + target: + entity_id: number.inverter_deye_program_4_soc + data: + value: 100 + - service: notify.persistent_notification + data: + title: '⚡ G12W: Ładowanie z sieci (PV niewystarczające)' + message: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set deficit = ((100 - soc) * 143.36) | round(0) %} + PV: {{ pv }}W, Zużycie: {{ load }}W, Nadmiar: {{ pv - load }}W. + Deficyt: {{ deficit }} Wh > Nadmiar 2h: {{ ((pv - load) * 2) | round(0) }} Wh. SOC: {{ soc }}% - alias: Solcast G12W - Wyłącz ładowanie dzienne 15:00 description: Wyłącza ładowanie po taniej strefie dziennej @@ -607,3 +651,106 @@ target: entity_id: counter.defrost_count mode: single + +- alias: Solcast G12W - Optymalizacja PV ładowania dziennego + id: g12w_pv_charging_optimization + description: > + Co 15 min 13:00-15:00: oblicza czy PV zdąży naładować baterię do końca okna. + Formuła: PV_nadmiar * pozostały_czas_h >= deficyt_baterii_Wh + Jeśli TAK → Battery First (zero importu dla ładowania). + Jeśli NIE → Load First + Grid charging 100A (tania taryfa G12W). + Pojemność baterii: 14336 Wh (280Ah LFP). + trigger: + - platform: time_pattern + minutes: '/15' + condition: + - condition: time + after: '13:00:00' + before: '15:00:00' + weekday: + - mon + - tue + - wed + - thu + - fri + - condition: numeric_state + entity_id: sensor.inverter_deye_battery + below: 100 + action: + - choose: + # PV zdąży naładować baterię do końca okna → nie potrzeba sieci + - conditions: + - condition: template + value_template: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set now_min = now().hour * 60 + now().minute %} + {% set remaining_h = ([15 * 60 - now_min, 0] | max) / 60 %} + {% set bat_deficit_wh = (100 - soc) * 143.36 %} + {% set pv_surplus_wh = (pv - load) * remaining_h %} + {{ pv > load and pv_surplus_wh >= bat_deficit_wh }} + sequence: + - service: switch.turn_off + target: + entity_id: switch.inverter_deye_battery_grid_charging + - service: select.select_option + target: + entity_id: select.inverter_deye_energy_pattern + data: + option: Battery First + - service: select.select_option + target: + entity_id: select.inverter_deye_program_4_charging + data: + option: Disabled + + # PV nie wystarczy → ładuj z sieci (tania G12W) + - conditions: + - condition: template + value_template: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set now_min = now().hour * 60 + now().minute %} + {% set remaining_h = ([15 * 60 - now_min, 0] | max) / 60 %} + {% set bat_deficit_wh = (100 - soc) * 143.36 %} + {% set pv_surplus_wh = (pv - load) * remaining_h %} + {{ (pv <= load or pv_surplus_wh < bat_deficit_wh) and soc < 95 }} + sequence: + - service: switch.turn_on + target: + entity_id: switch.inverter_deye_battery_grid_charging + - service: select.select_option + target: + entity_id: select.inverter_deye_energy_pattern + data: + option: Load First + - service: number.set_value + target: + entity_id: number.inverter_deye_battery_grid_charging_current + data: + value: 100 + - service: select.select_option + target: + entity_id: select.inverter_deye_program_4_charging + data: + option: Grid + - service: number.set_value + target: + entity_id: number.inverter_deye_program_4_soc + data: + value: 100 + - service: notify.persistent_notification + data: + title: '⚡ G12W: PV nie zdąży → ładowanie z sieci' + message: > + {% set pv = states('sensor.inverter_deye_pv_power') | int(0) %} + {% set load = states('sensor.inverter_deye_load_power') | int(1000) %} + {% set soc = states('sensor.inverter_deye_battery') | int(0) %} + {% set now_min = now().hour * 60 + now().minute %} + {% set remaining_h = ([15 * 60 - now_min, 0] | max) / 60 %} + {% set deficit = ((100 - soc) * 143.36) | round(0) %} + {% set surplus = ((pv - load) * remaining_h) | round(0) %} + Pozostało: {{ remaining_h | round(2) }}h, PV nadmiar: {{ surplus }} Wh < deficyt: {{ deficit }} Wh. SOC: {{ soc }}% + mode: single