From 3e674b0d947d25bd03b28577e81fb8e73ea07a75 Mon Sep 17 00:00:00 2001 From: Sander <39280315+sadegroo@users.noreply.github.com> Date: Thu, 30 Oct 2025 17:02:05 +0100 Subject: [PATCH 1/3] Add Growatt home battery configuration --- doc_img/growatt_home_battery.yaml | 475 ++++++++++++++++++++++++++++++ 1 file changed, 475 insertions(+) create mode 100644 doc_img/growatt_home_battery.yaml diff --git a/doc_img/growatt_home_battery.yaml b/doc_img/growatt_home_battery.yaml new file mode 100644 index 0000000..b4e1eb0 --- /dev/null +++ b/doc_img/growatt_home_battery.yaml @@ -0,0 +1,475 @@ +esphome: + name: inverterlezer + friendly_name: inverterlezer + +esp32: + board: esp32dev + framework: + type: esp-idf + +# Enable logging +logger: + +# Enable Home Assistant API +api: + encryption: + key: "" + +ota: + - platform: esphome + password: "" + +wifi: + ssid: !secret wifi_ssid + password: !secret wifi_password + + # Enable fallback hotspot (captive portal) in case wifi connection fails + ap: + ssid: "Inverterlezer Fallback Hotspot" + password: "" + +captive_portal: + +# RS485 Modbus config +uart: + - id: uart_pv + tx_pin: GPIO17 #check if correct for your board/port + rx_pin: GPIO16 #check if correct for your board/port + baud_rate: 9600 + parity: NONE + stop_bits: 1 + +modbus: + - uart_id: uart_pv + id: modbus_client + send_wait_time: 1000ms + +modbus_controller: + - id: modbus_pv + modbus_id: modbus_client + address: 1 + setup_priority: -10 + update_interval: 30s + command_throttle: 1000ms + +# Growatt r/w setting writers +switch: + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt On/Off" + register_type: holding + address: 0 + bitmask: 1 # Assuming 1 is ON, 0 is OFF + entity_category: config + icon: mdi:toggle-switch + +number: + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Active Power Rate" + register_type: holding + address: 3 + value_type: U_WORD + min_value: 0 + max_value: 100 + step: 1 + unit_of_measurement: "%" + multiply: 1 + entity_category: config + icon: mdi:gauge + mode: SLIDER + + +sensor: + # Growatt read-only sensors with home assistant config + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV input Power" + address: 1 # PPV H + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:flash + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt AC Output Power" + address: 35 # Pac H (start van 32-bit waarde) + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:power-plug + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt AC Energy Today" + address: 53 # EAC today H / Today generate energy (high) / 0.1 kWh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: measurement + icon: mdi:power-plug + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt AC Energy Total" + address: 55 # EAC total H / Total generate energy (high) 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:power-plug + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV1 Energy Today" + address: 59 # EPV1 today H / PV1 Energy today(high) / 0.1 kWh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: measurement + icon: mdi:solar-power + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV1 Energy Total" + address: 61 # EPV1 total H / PV1 Energy total(high) 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:solar-power + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV2 Energy Today" + address: 63 # EPV2 today H / PV2 Energy today(high) / 0.1 kWh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: measurement + icon: mdi:solar-power + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV2 Energy Total" + address: 65 # EPV2 total H / PV2 Energy total(high) 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:solar-power + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV Energy Total" + address: 91 # EPV total H / PV Energy total(high) 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:solar-power + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV1 Voltage" + address: 3 + register_type: "read" + unit_of_measurement: V + device_class: voltage + state_class: measurement + icon: mdi:sine-wave + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV2 Voltage" + address: 7 + register_type: "read" + unit_of_measurement: V + device_class: voltage + state_class: measurement + icon: mdi:sine-wave + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV1 Input Power" + address: 5 + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:flash + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV2 Input Power" + address: 9 + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:flash + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV1 Current" + address: 4 + register_type: "read" + unit_of_measurement: A + device_class: current + state_class: measurement + icon: mdi:current-ac + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt PV2 Current" + address: 8 + register_type: "read" + unit_of_measurement: A + device_class: current + state_class: measurement + icon: mdi:current-ac + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Inverter Temperature" + address: 93 + register_type: "read" + unit_of_measurement: °C + device_class: temperature + state_class: measurement + icon: mdi:thermometer + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Grid Voltage" + address: 38 # Vac1 + register_type: "read" + unit_of_measurement: V + device_class: voltage + state_class: measurement + icon: mdi:sine-wave + value_type: U_WORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Grid Frequency" + address: 37 # Fac + register_type: "read" + unit_of_measurement: Hz + device_class: frequency + state_class: measurement + icon: mdi:waveform + value_type: U_WORD + accuracy_decimals: 2 + filters: + - multiply: 0.01 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Fault Code" + address: 105 + register_type: "read" + value_type: U_WORD + entity_category: diagnostic + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery State-of-charge" + address: 3171 # SOC + register_type: "read" + unit_of_measurement: "%" + device_class: battery + state_class: measurement + icon: mdi:battery + value_type: U_WORD + accuracy_decimals: 0 + filters: + - multiply: 1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Discharged Today" + address: 3125 # / 0.1 kWh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: measurement + icon: mdi:battery-arrow-down + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Discharged Total" + address: 3127 # 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:battery-arrow-down + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Charged Today" + address: 3129 # / 0.1 kWh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: measurement + icon: mdi:battery-arrow-up + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Charged Total" + address: 3131 # 0.1kwh + register_count: 2 + register_type: "read" + unit_of_measurement: kWh + device_class: energy + state_class: total_increasing + icon: mdi:battery-arrow-up + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Discharge Power" + address: 3178 # 0.1 W + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:battery-arrow-down + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery Charge Power" + address: 3180 # / 0.1 W + register_count: 2 + register_type: "read" + unit_of_measurement: W + device_class: power + state_class: measurement + icon: mdi:battery-arrow-up + value_type: U_DWORD + accuracy_decimals: 1 + filters: + - multiply: 0.1 + +text_sensor: + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Inverter Status" + address: 0 + register_type: "read" + raw_encode: HEXBYTES + lambda: |- + uint16_t value = modbus_controller::word_from_hex_str(x, 0); + switch (value) { + case 0: return std::string("Waiting"); + case 1: return std::string("Normal"); + case 3: return std::string("Fault"); + default: return std::string("Unknown"); + } + icon: mdi:information From f6c507ef1e81693303a9df935500a233486a4544 Mon Sep 17 00:00:00 2001 From: sadegroo <39280315+sadegroo@users.noreply.github.com> Date: Sun, 15 Mar 2026 12:39:17 +0100 Subject: [PATCH 2/3] Enhance Growatt home battery YAML configuration Updated Growatt home battery configuration with new modbus controls and parameters, including TimeSlot1 settings and readback functionality. --- doc_img/growatt_home_battery.yaml | 361 ++++++++++++++++++++++++++++-- 1 file changed, 347 insertions(+), 14 deletions(-) diff --git a/doc_img/growatt_home_battery.yaml b/doc_img/growatt_home_battery.yaml index b4e1eb0..37ee1d8 100644 --- a/doc_img/growatt_home_battery.yaml +++ b/doc_img/growatt_home_battery.yaml @@ -13,11 +13,11 @@ logger: # Enable Home Assistant API api: encryption: - key: "" + key: "your key here" ota: - platform: esphome - password: "" + password: "your PW here" wifi: ssid: !secret wifi_ssid @@ -26,15 +26,15 @@ wifi: # Enable fallback hotspot (captive portal) in case wifi connection fails ap: ssid: "Inverterlezer Fallback Hotspot" - password: "" + password: "your pw here" captive_portal: # RS485 Modbus config uart: - id: uart_pv - tx_pin: GPIO17 #check if correct for your board/port - rx_pin: GPIO16 #check if correct for your board/port + tx_pin: GPIO17 + rx_pin: GPIO16 baud_rate: 9600 parity: NONE stop_bits: 1 @@ -56,13 +56,31 @@ modbus_controller: switch: - platform: modbus_controller modbus_controller_id: modbus_pv - name: "Growatt On/Off" + name: "Growatt On-Off" register_type: holding address: 0 - bitmask: 1 # Assuming 1 is ON, 0 is OFF + bitmask: 1 entity_category: config icon: mdi:toggle-switch + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt AC Charge Enable" + register_type: holding + address: 3049 + bitmask: 1 + entity_category: config + icon: mdi:battery-charging + + # TimeSlot1 enable — local toggle, applied when you press the write button + - platform: template + name: "Growatt TimeSlot1 Enable" + id: ts1_enable + optimistic: true + restore_mode: RESTORE_DEFAULT_OFF + entity_category: config + icon: mdi:calendar-check + number: - platform: modbus_controller modbus_controller_id: modbus_pv @@ -79,8 +97,222 @@ number: icon: mdi:gauge mode: SLIDER + # ── TL-XH Battery First controls (3000-range) ──────────────────────── + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery First Power Rate" + register_type: holding + address: 3047 + value_type: U_WORD + min_value: 0 + max_value: 100 + step: 1 + unit_of_measurement: "%" + multiply: 1 + entity_category: config + icon: mdi:gauge + mode: SLIDER + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Battery First Stop SOC" + register_type: holding + address: 3048 + value_type: U_WORD + min_value: 0 + max_value: 100 + step: 1 + unit_of_measurement: "%" + multiply: 1 + entity_category: config + icon: mdi:gauge + mode: SLIDER + + # ── Grid First controls (3000-range) ────────────────────────────────── + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Grid First Discharge Power Rate" + register_type: holding + address: 3036 + value_type: U_WORD + min_value: 0 + max_value: 100 + step: 1 + unit_of_measurement: "%" + multiply: 1 + entity_category: config + icon: mdi:gauge + mode: SLIDER + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Grid First Stop SOC" + register_type: holding + address: 3037 + value_type: U_WORD + min_value: 0 + max_value: 100 + step: 1 + unit_of_measurement: "%" + multiply: 1 + entity_category: config + icon: mdi:gauge + mode: SLIDER + + ########################################################################### + # TIME SLOT 1 — bit-packed registers 3038/3039 + # + # These are complex: each register packs hour, minute, priority, and + # enable into a single 16-bit value. Direct slider control isn't + # practical, so we use template numbers for the individual fields + # and a button to assemble and write the packed value. + # + # Register 3038 (start time + config): + # Bit 0-7: minutes (0-59) + # Bit 8-12: hour (0-23) + # Bit 13-14: priority (0=load, 1=battery, 2=grid) + # Bit 15: enable (0=disabled, 1=enabled) + # + # Register 3039 (end time): + # Bit 0-7: minutes (0-59) + # Bit 8-12: hour (0-23) + ########################################################################### + + - platform: template + name: "Growatt TimeSlot1 Start Hour" + id: ts1_start_hour + min_value: 0 + max_value: 23 + step: 1 + optimistic: true + restore_value: true + initial_value: 0 + entity_category: config + icon: mdi:clock-start + mode: SLIDER + + - platform: template + name: "Growatt TimeSlot1 Start Minute" + id: ts1_start_min + min_value: 0 + max_value: 59 + step: 1 + optimistic: true + restore_value: true + initial_value: 0 + entity_category: config + icon: mdi:clock-start + mode: SLIDER + + - platform: template + name: "Growatt TimeSlot1 End Hour" + id: ts1_end_hour + min_value: 0 + max_value: 23 + step: 1 + optimistic: true + restore_value: true + initial_value: 0 + entity_category: config + icon: mdi:clock-end + mode: SLIDER + + - platform: template + name: "Growatt TimeSlot1 End Minute" + id: ts1_end_min + min_value: 0 + max_value: 59 + step: 1 + optimistic: true + restore_value: true + initial_value: 0 + entity_category: config + icon: mdi:clock-end + mode: SLIDER -sensor: + - platform: template + name: "Growatt TimeSlot1 Priority" + id: ts1_priority + min_value: 0 + max_value: 2 + step: 1 + optimistic: true + restore_value: true + initial_value: 1 + entity_category: config + icon: mdi:priority-high + mode: SLIDER + # 0=load first, 1=battery first, 2=grid first + +select: + - platform: template + name: "Growatt TimeSlot1 Priority Name" + id: ts1_priority_name + options: + - "Load First" + - "Battery First" + - "Grid First" + initial_option: "Battery First" + optimistic: true + entity_category: config + icon: mdi:priority-high + on_value: + - lambda: |- + if (x == "Load First") id(ts1_priority).make_call().set_value(0).perform(); + else if (x == "Battery First") id(ts1_priority).make_call().set_value(1).perform(); + else if (x == "Grid First") id(ts1_priority).make_call().set_value(2).perform(); + +button: + # Write time slot 1 to registers 3038/3039 + - platform: template + name: "Growatt Write TimeSlot1" + icon: mdi:upload + entity_category: config + on_press: + - lambda: |- + uint16_t start_h = (uint16_t)id(ts1_start_hour).state; + uint16_t start_m = (uint16_t)id(ts1_start_min).state; + uint16_t end_h = (uint16_t)id(ts1_end_hour).state; + uint16_t end_m = (uint16_t)id(ts1_end_min).state; + uint16_t prio = (uint16_t)id(ts1_priority).state; + uint16_t enable = id(ts1_enable).state ? 1 : 0; + + // Pack register 3038: enable(15) | priority(13-14) | hour(8-12) | minutes(0-7) + uint16_t reg3038 = (enable << 15) | (prio << 13) | (start_h << 8) | start_m; + // Pack register 3039: hour(8-12) | minutes(0-7) + uint16_t reg3039 = (end_h << 8) | end_m; + + ESP_LOGW("timeslot", ">>> Writing TimeSlot1: 3038=0x%04X 3039=0x%04X", reg3038, reg3039); + ESP_LOGW("timeslot", ">>> Start=%02u:%02u End=%02u:%02u Prio=%u Enable=%u", + start_h, start_m, end_h, end_m, prio, enable); + + auto *ctl = id(modbus_pv); + ctl->queue_command( + esphome::modbus_controller::ModbusCommandItem::create_write_single_command(ctl, 3038, reg3038)); + - delay: 1000ms + - lambda: |- + uint16_t end_h = (uint16_t)id(ts1_end_hour).state; + uint16_t end_m = (uint16_t)id(ts1_end_min).state; + uint16_t reg3039 = (end_h << 8) | end_m; + + auto *ctl = id(modbus_pv); + ctl->queue_command( + esphome::modbus_controller::ModbusCommandItem::create_write_single_command(ctl, 3039, reg3039)); + - logger.log: + level: WARN + format: ">>> TimeSlot1 written to 3038/3039" + +sensor: + # temp and humidity sensor + - platform: dht + model: DHT22 + pin: GPIO18 + temperature: + name: "Attic Temperature" + humidity: + name: "Attic Humidity" + update_interval: 60s + # Growatt read-only sensors with home assistant config - platform: modbus_controller modbus_controller_id: modbus_pv @@ -107,7 +339,7 @@ sensor: device_class: power state_class: measurement icon: mdi:power-plug - value_type: U_DWORD + value_type: S_DWORD accuracy_decimals: 1 filters: - multiply: 0.1 @@ -120,7 +352,7 @@ sensor: register_type: "read" unit_of_measurement: kWh device_class: energy - state_class: measurement + state_class: total_increasing icon: mdi:power-plug value_type: U_DWORD accuracy_decimals: 1 @@ -150,7 +382,7 @@ sensor: register_type: "read" unit_of_measurement: kWh device_class: energy - state_class: measurement + state_class: total_increasing icon: mdi:solar-power value_type: U_DWORD accuracy_decimals: 1 @@ -180,7 +412,7 @@ sensor: register_type: "read" unit_of_measurement: kWh device_class: energy - state_class: measurement + state_class: total_increasing icon: mdi:solar-power value_type: U_DWORD accuracy_decimals: 1 @@ -375,7 +607,7 @@ sensor: register_type: "read" unit_of_measurement: kWh device_class: energy - state_class: measurement + state_class: total_increasing icon: mdi:battery-arrow-down value_type: U_DWORD accuracy_decimals: 1 @@ -405,7 +637,7 @@ sensor: register_type: "read" unit_of_measurement: kWh device_class: energy - state_class: measurement + state_class: total_increasing icon: mdi:battery-arrow-up value_type: U_DWORD accuracy_decimals: 1 @@ -457,6 +689,91 @@ sensor: filters: - multiply: 0.1 + # ── Priority readback ───────────────────────────────────────────────── + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt Priority Raw" + id: priority_raw + register_type: read + address: 2118 + value_type: U_WORD + entity_category: diagnostic + icon: mdi:priority-high + + # ── TL-XH time slot readback (decoded) ──────────────────────────────── + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt TimeSlot1 Reg3038 Raw" + id: reg3038_raw + register_type: holding + address: 3038 + value_type: U_WORD + entity_category: diagnostic + + - platform: modbus_controller + modbus_controller_id: modbus_pv + name: "Growatt TimeSlot1 Reg3039 Raw" + id: reg3039_raw + register_type: holding + address: 3039 + value_type: U_WORD + entity_category: diagnostic + + - platform: template + name: "Growatt TimeSlot1 Readback StartHour" + lambda: |- + if (id(reg3038_raw).has_state()) + return (float)(((int)id(reg3038_raw).state >> 8) & 0x1F); + return {}; + entity_category: diagnostic + update_interval: 30s + + - platform: template + name: "Growatt TimeSlot1 Readback StartMin" + lambda: |- + if (id(reg3038_raw).has_state()) + return (float)((int)id(reg3038_raw).state & 0xFF); + return {}; + entity_category: diagnostic + update_interval: 30s + + - platform: template + name: "Growatt TimeSlot1 Readback EndHour" + lambda: |- + if (id(reg3039_raw).has_state()) + return (float)(((int)id(reg3039_raw).state >> 8) & 0x1F); + return {}; + entity_category: diagnostic + update_interval: 30s + + - platform: template + name: "Growatt TimeSlot1 Readback EndMin" + lambda: |- + if (id(reg3039_raw).has_state()) + return (float)((int)id(reg3039_raw).state & 0xFF); + return {}; + entity_category: diagnostic + update_interval: 30s + + - platform: template + name: "Growatt TimeSlot1 Readback Enabled" + lambda: |- + if (id(reg3038_raw).has_state()) + return (float)(((int)id(reg3038_raw).state >> 15) & 1); + return {}; + entity_category: diagnostic + update_interval: 30s + + - platform: template + name: "Growatt TimeSlot1 Readback Priority" + lambda: |- + if (id(reg3038_raw).has_state()) + return (float)(((int)id(reg3038_raw).state >> 13) & 0x03); + return {}; + entity_category: diagnostic + update_interval: 30s + # 0=load first, 1=battery first, 2=grid first + text_sensor: - platform: modbus_controller modbus_controller_id: modbus_pv @@ -473,3 +790,19 @@ text_sensor: default: return std::string("Unknown"); } icon: mdi:information + + - platform: template + name: "Growatt Priority" + lambda: |- + if (id(priority_raw).has_state()) { + int val = (int)id(priority_raw).state; + switch (val) { + case 0: return std::string("Load First"); + case 1: return std::string("Battery First"); + case 2: return std::string("Grid First"); + default: return std::string("Unknown"); + } + } + return std::string("waiting..."); + update_interval: 30s + icon: mdi:priority-high From 27dbf21d9a5ba1aed73f89c1e776113bd8340adc Mon Sep 17 00:00:00 2001 From: Sander <39280315+sadegroo@users.noreply.github.com> Date: Sun, 15 Mar 2026 12:43:58 +0100 Subject: [PATCH 3/3] Move growatt_home_battery.yaml to project root Rename doc_img/growatt_home_battery.yaml to growatt_home_battery.yaml without content changes. This relocates the file out of the doc_img directory to simplify file paths and organization. --- doc_img/growatt_home_battery.yaml => growatt_home_battery.yaml | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename doc_img/growatt_home_battery.yaml => growatt_home_battery.yaml (100%) diff --git a/doc_img/growatt_home_battery.yaml b/growatt_home_battery.yaml similarity index 100% rename from doc_img/growatt_home_battery.yaml rename to growatt_home_battery.yaml