From 0cb83728b8ff6808af33cfc9186c83306e075cf8 Mon Sep 17 00:00:00 2001 From: 31c0fe9c6dbd74bcdde92e1d2aaa03e1d272f75f Date: Wed, 31 Aug 2022 13:25:05 +1000 Subject: [PATCH] Home Assistant Git Exporter --- config/packages/sungrow.yaml | 84 ++++++++++++++++++--------- config/zigbee2mqtt/state.json | 6 +- lovelace/lovelace.lovelace_solar.yaml | 4 ++ 3 files changed, 63 insertions(+), 31 deletions(-) diff --git a/config/packages/sungrow.yaml b/config/packages/sungrow.yaml index 9689d46..bc0fd1d 100644 --- a/config/packages/sungrow.yaml +++ b/config/packages/sungrow.yaml @@ -234,7 +234,6 @@ automation: entity_id: input_number.inverter_forced_mode_battery_power data_template: value: "{{ states('sensor.inverter_battery_forced_charge_discharge_power') | int }}" - hub: SungrowSHx # The inverter can only generate 5kW of AC power. IFF the battery is not-full, it can generate 5kW of AC _and_ charge # battery at up to 6.6kW, which saturates our 8.46 kW of PV @@ -263,13 +262,9 @@ automation: alias: Inverter - maximise output mode: restart trigger: - - platform: numeric_state - entity_id: sensor.inverter_pv_power - above: 4900 - for: - minutes: 1 - platform: state entity_id: + - sensor.inverter_pv_power - sensor.inverter_battery_level - sensor.inverter_active_power - sensor.home_weather_cloud_coverage @@ -285,17 +280,48 @@ automation: - unavailable - unknown variables: + # Magic numbers + ems_self_consume: 0 + ems_forced: 2 + battery_charge: 0xAA + battery_discharge: 0xBB + battery_stop: 0xCC + active_power_limit: 4999 # W + active_power_buffer: 200 # W - how much below limit we want to sit + battery_lower_limit: 50 # % + battery_capacity: 12.8 # kWh + + # Shorthands + current_active_power: "{{ states('sensor.inverter_active_power') | int }}" + current_pv_power: "{{ states('sensor.inverter_pv_power') | int }}" + current_ems_mode: "{{ states('sensor.inverter_ems_mode_raw') | int(default=-1) }}" + current_battery_mode: "{{ states('sensor.inverter_forced_battery_mode_raw') | int(default=0) }}" + battery_level: "{{ states('sensor.inverter_battery_level') | float }}" + forced_battery_power: "{{ states('sensor.inverter_battery_forced_charge_discharge_power') | int }}" + forecast_remaining: "{{ states('sensor.solcast_forecast_remaining_today') | float }}" + + target_active_power: "{{ active_power_limit - active_power_buffer }}" + desired_forced_battery_power: 2000 + is_forced_charging: > + {{ current_ems_mode == ems_forced and current_battery_mode == battery_charge }} + is_self_consuming: > + {{ current_ems_mode == ems_self_consume }} kwh_until_full: > - {{ 12.8 * ((100 - states('sensor.inverter_battery_level') | float)/100) }} + {{ battery_capacity * ((100 - battery_level)/100) }} + enough_in_day: > + {{2*kwh_until_full < forecast_remaining}} + battery_high_enough: "{{ battery_level > battery_lower_limit }}" sunsetting: > {{ now() + timedelta(hours = 1) > state_attr('sun.sun', 'next_setting')| as_datetime }} should_slow_battery: > {{ states('sensor.inverter_pv_power') | float > 5100 and states('sensor.inverter_active_power') | float < 4200 }} - enough_in_day: > - {{2*kwh_until_full < states('sensor.solcast_forecast_remaining_today') | float}} - condition: [] action: + - service: input_number.set_value + target: + entity_id: input_number.inverter_forced_mode_battery_power + data_template: + value: "{{ desired_forced_battery_power }}" - choose: - conditions: - "{{ should_slow_battery and not sunsetting and enough_in_day }}" @@ -1147,24 +1173,26 @@ modbus: # swap: word # precision: 0 # scan_interval: 10 - # - name: EMS Mode Selection raw - # slave: 1 - # address: 13049 # 13050 - # input_type: holding - # count: 1 - # data_type: uint16 - # swap: word - # scan_interval: 10 - # - name: Inverter charge command (raw) - # unique_id: d1158bbfa40d73933a72 - # slave: 1 - # address: 13050 # 13051 - # input_type: holding - # count: 1 - # data_type: uint16 - # swap: word - # precision: 0 - # scan_interval: 60 + - name: Inverter EMS mode (raw) + unique_id: e48a4229b845475df29e + slave: 1 + address: 13049 # 13050 + input_type: holding + count: 1 + data_type: uint16 + swap: word + scan_interval: 10 + + - name: Inverter forced battery mode (raw) + unique_id: d1158bbfa40d73933a72 + slave: 1 + address: 13050 # 13051 + input_type: holding + count: 1 + data_type: uint16 + swap: word + precision: 0 + scan_interval: 10 - name: Inverter battery forced charge/discharge power slave: 1 diff --git a/config/zigbee2mqtt/state.json b/config/zigbee2mqtt/state.json index 1b3b6e2..19ad85e 100644 --- a/config/zigbee2mqtt/state.json +++ b/config/zigbee2mqtt/state.json @@ -13,7 +13,7 @@ "battery": 41, "temperature": 19, "linkquality": 255, - "device_temperature": 21, + "device_temperature": 23, "power_outage_count": 8 }, "0x00158d00080915bd": { @@ -22,7 +22,7 @@ "battery": 44, "temperature": 17, "linkquality": 255, - "device_temperature": 13, + "device_temperature": 18, "power_outage_count": 7 }, "0x00158d0007e7725b": { @@ -40,7 +40,7 @@ "battery": 50, "temperature": 12, "linkquality": 255, - "device_temperature": 15, + "device_temperature": 14, "power_outage_count": 13 }, "0x00158d0007e4c4f2": { diff --git a/lovelace/lovelace.lovelace_solar.yaml b/lovelace/lovelace.lovelace_solar.yaml index 62121dd..7534671 100644 --- a/lovelace/lovelace.lovelace_solar.yaml +++ b/lovelace/lovelace.lovelace_solar.yaml @@ -491,6 +491,10 @@ config: entity: script.inverter_force_battery_stop icon: mdi:stop name: Stop + - entity: input_number.inverter_forced_mode_battery_power + name: Set forced power + - entity: sensor.inverter_battery_forced_charge_discharge_power + name: Current forced power title: Battery mode type: entities - entities: