Logic
Members
-
Joined
-
Last visited
Reputation Activity
-
Logic got a reaction from Bram in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesI also tried the charge settings with the original 43.05 and got NAK.
The patched firmware from @Coulomballows for settings voltages through the communication port.
@NkunziYou can try running this on you Pi Zero (if you're not already using it): https://github.com/ned-kelly/docker-voltronic-homeassistant
Though I'm not sure if you can easily automate commands on it without MQTT.
I'm working on expanding the below as a solution for a single inverter (keeping it relaively cheap, so my friends and family can also get the solution), using a single ESP32 (costs about R150) and MAX3232 module (costs about R15) . It connects to the WiFi and is accessible on local network via the IP in a web browser. It displays real-time data, and counting totals (sadly no fancy logs, or graphs). Since the charge voltage commands are working, it's now possible to mimic bulk charging with the ESP.
My idea is something like this, please let me know if you have any suggestions:
Program ESP32 with the below sliders for variable values
vdiff - desired voltage difference between bulk and float mcur - minimum charge current for bulk charge Then, every few seconds the ESP32 will get these charge parameters from the inverter:
bulk - Bulk charge voltage float - Float charge voltage charge current - Current charge current Each time the ESP32 receives new data from the inverter, it runs the below:
IF (charge current > mcur) AND (float < bulk)
THEN set(float = bulk) #Increase float voltage to bulk voltage to mimic bulk charging
IF (charge current < mcur) AND (float = bulk)
THEN set(float = float - vdiff) #Reduces float charge voltage back to desired float voltage based on vdiff
IF (float = bulk)
THEN long flash LED on ESP32 #Visual indicator that it's still working and charging at bulk voltage
IF (float =! bulk) #Bulk not equal to float
THEN quick flash LED on ESP32 #Visual indicator that it's still working and set to float
-
Logic got a reaction from Bram in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesThanks for the heads up, here's the updated firmware file attached with the 48V inverter set float stage voltage range.
ESP32 ESPHome Standalone Firmware for Axpert-48V-Inverter (ver1.1).bin
-
Logic got a reaction from Bram in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesHi Bram,
Are you looking for using it in standalone mode or with Home Assistant? What voltage is your inverter?
-
Logic got a reaction from Bram in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesThanks, then I'm not going to retest with the original 43.05.
I'll keep some pressure on Rectron to get some of the firmware issues resolved.
Glad to hear you managed to get your voltage offset sorted.
I guess you've had the inverter for a while, or you might have gotten somewhat older stock, I'd estimate 43.02 is from around middle last year. My knowledge on lead acid batteries is not very broad, but I hope they'll be fine if you managed to catch it early enough. If it's been from middle last year and ran them at 32V then I'm pretty sure they won't be the same anymore.
Regarding the firmware update, if you were able to send the command to offset the voltage, you shouldn't have any trouble with upgrading the firmware. Just make sure the computer you use is not powered from the inverter.
The below is the latest firmware, thanks to Coulumb (you can choose between the patched and original one), and there is a document explaining the process for upgrading the firmware.
-
Logic got a reaction from jumper in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesAxpert 24V Bulk Charge workaround with ESP32.
Here's my ESP32 solution using ESPHome for anyone who might be interested. It's aimed at 24V Axpert inverters without a working bulk charge mode, to enable bulk charging reliably by adjusting the float charge voltage.
Please note that this is by no means an extensive DIY how to guide, however, with the linked sources and what I've shared, you should have access to everything you need to make this yourself.
These are the main settings to configure for bulk charging:
Set float stage voltage - Set this value to your desired float charge voltage.
Switch to bulk current - When charging current exceeds the value set here, the float voltage will be changed to the bulk charge voltage that's set on the inverter.
Switch to float current - When charging current drops below the value set here, the float voltage will be changed to the value in Set float stage voltage.
Bulk charge voltage - This allows for changing the bulk charge voltage on the inverter settings via the ESP.
If needed I can also share a compiled firmware.bin file that can be flashed to an ESP32 module if anyone is interested.
I'd like to give credit to the below for making this possible:
https://github.com/Bandit-17/PVBRAIN/blob/main/code/pvbrain.yaml https://github.com/syssi/esphome-pipsolar/tree/pip8048 @Coulomb's firmware fix for the charging commands https://www.thingiverse.com/thing:3164954 (Printed at a scale 85% of the original size) https://esphome.io/
Notes:
ESPHome version 2023.7.0 or later is required for compiling to get a stable, working web portal. A Home Assistant server is not required. There's a lot of areas that's commented out that I left in case anyone would like to expand on them. Flashing of ESPHome firmware can be done via https://web.esphome.io/ Time is synced from internet (not required for getting bulk charge workaround to work) Wi-Fi is required to access the web portal from a web browser on the same local network. The status LED on the ESP32 is not serving a purpose yet, and I hope to make use of it in the future, to indicate whether bulk or float charging is currently active. It plugs directly into the RS232 port of an Axpert inverter, and is powered from the inverter as well. The WiFi connection can be setup after connecting to the Wi-Fi Access Point of the ESP32 and entering the Wi-Fi details in the captive portal. Keep this is mind when using the sliders: These sliders are variables, they're values are indicative of the value of the variable: These sliders only send a command to the inverter after being adjusted, they don't update when the setting is changed on the inverter itself, it only displays the last value the slider was set to. Instead, use the sensor values to determine the actual value of the setting on the inverter. Hardware used:
https://www.robotics.org.za/MX3232-MOD https://www.robotics.org.za/ESP32-DEV-CP2102-C?search=esp32 Ethernet cable to cut. Option: https://www.robotics.org.za/XL4015?search=buck regulator or USB charger with Type-C connector Optional: Enclosure Here's pictures of the solution:
The below picture is from Home Assistant and indicates how the charging workaround works (left side of the graphs).
#### ESPHome YAML Config for 24V Axpert inverter with Bulk Charge workaround #### substitutions: name: axpert inverter: rct tx_pin_inverter: GPIO17 rx_pin_inverter: GPIO16 baud_rate_inverter: '2400' template_update: 2s text_update: 5s esphome: name: ${name} friendly_name: RCT Inverter comment: RCT Inverter Standalone # platformio_options: # build_flags: # - -DCONFIG_ARDUINO_LOOP_STACK_SIZE=32768 # 16384 # 8192 # 16384 # platform_packages: # - framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git#2.0.2 # platform: # - https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream esp32: board: esp32dev framework: type: esp-idf external_components: - source: github://syssi/esphome-pipsolar@pip8048 refresh: 0s # Enable logging logger: # baud_rate: 0 # Enable Home Assistant API # api: # encryption: # key: !secret api_key # ota: # password: !secret ota_password wifi: power_save_mode: none ssid: !secret wifi_ssid password: !secret wifi_password # manual_ip: # static_ip: 10.0.0.55 # gateway: 10.0.0.254 # subnet: 255.255.255.0 # dns1: 1.1.1.1 # dns2: 8.8.8.8 ap: ssid: "Axpert Fallback Hotspot" password: "RCT123456" captive_portal: web_server: port: 80 # auth: # username: !secret web_server_username # password: !secret web_server_password globals: # - id: ${name}_${inverter}_PV_power_total_yesterday_global # type: float # restore_value: yes - id: ${name}_${inverter}_ac_output_active_power_yesterday_global type: float restore_value: yes - id: ${name}_${inverter}_battery_charging_power_yesterday_global type: float restore_value: yes - id: ${name}_${inverter}_battery_discharging_power_yesterday_global type: float restore_value: yes time: platform: sntp id: my_time timezone: "Africa/Johannesburg" on_time: - seconds: 59 minutes: 59 hours: 23 then: # - globals.set: # id: ${name}_${inverter}_PV_power_total_yesterday_global # value: !lambda return ( id(${name}_${inverter}_PV_power_total_yesterday_global) = float( id(${name}_${inverter}_PV_power_total_today).state) ); - globals.set: id: ${name}_${inverter}_ac_output_active_power_yesterday_global value: !lambda return ( id(${name}_${inverter}_ac_output_active_power_yesterday_global) = float( id(${name}_${inverter}_ac_output_active_power_total_today).state) ); - globals.set: id: ${name}_${inverter}_battery_charging_power_yesterday_global value: !lambda return ( id(${name}_${inverter}_battery_charging_power_yesterday_global) = float( id(${name}_${inverter}_battery_charging_power_total_today).state) ); - globals.set: id: ${name}_${inverter}_battery_discharging_power_yesterday_global value: !lambda return ( id(${name}_${inverter}_battery_discharging_power_yesterday_global) = float( id(${name}_${inverter}_battery_discharging_power_total_today).state) ); ####################### UART ####################### uart: ######### UART for PIPsolar RS232 ###### - id: uart_1 tx_pin: ${tx_pin_inverter} rx_pin: ${rx_pin_inverter} baud_rate: ${baud_rate_inverter} ######################### DEVICES UART/MODBUS based ################### pipsolar: - uart_id: uart_1 id: pip8048 #update_interval: 5s output: - platform: pipsolar pipsolar_id: pip8048 battery_bulk_voltage: id: ${name}_${inverter}_battery_bulk_voltage_set possible_values: [25.0,25.1,25.2,25.3,25.4,25.5,25.6,25.7,25.8,25.9,26.0,26.1,26.2,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27.0,27.1,27.2,27.3,27.4,27.5,27.6,27.7,27.8,27.9,28.0,28.1,28.2,28.3,28.4,28.5,28.6,28.7,28.8,28.9,29.0,29.1,29.2,29.3,29.4,29.5,29.6,29.7,29.8,29.9,30.0,30.1,30.2,30.3,30.4,30.5,30.6,30.7,30.8,30.9,31.0] - platform: pipsolar pipsolar_id: pip8048 battery_float_voltage: id: ${name}_${inverter}_battery_float_voltage_set possible_values: [25.0,25.1,25.2,25.3,25.4,25.5,25.6,25.7,25.8,25.9,26.0,26.1,26.2,26.3,26.4,26.5,26.6,26.7,26.8,26.9,27.0,27.1,27.2,27.3,27.4,27.5,27.6,27.7,27.8,27.9,28.0,28.1,28.2,28.3,28.4,28.5,28.6,28.7,28.8,28.9,29.0,29.1,29.2,29.3,29.4,29.5,29.6,29.7,29.8,29.9,30.0,30.1,30.2,30.3,30.4,30.5,30.6,30.7,30.8,30.9,31.0] # - platform: pipsolar # pipsolar_id: pip8048 # current_max_charging_current: # id: ${name}_${inverter}_current_max_charging_current_set # possible_values: [10,20,30,40,50,60,70,80] # - platform: pipsolar # pipsolar_id: pip8048 # current_max_ac_charging_current: # id: ${name}_${inverter}_current_max_ac_charging_current_set # possible_values: [2,10,20,30,40,50,60,70,80] - platform: pipsolar pipsolar_id: pip8048 battery_under_voltage: id: ${name}_${inverter}_battery_under_voltage_set possible_values: [21.0, 21.1, 21.2, 21.3, 21.4, 21.5, 21.6, 21.7, 21.8, 21.9, 22.0, 22.1, 22.2, 22.3, 22.4, 22.5, 22.6, 22.7, 22.8, 22.9, 23.0, 23.1, 23.2, 23.3, 23.4, 23.5, 23.6, 23.7, 23.8, 23.9, 24.0] # - platform: pipsolar # pipsolar_id: pip8048 # battery_recharge_voltage: # id: ${name}_${inverter}_battery_recharge_voltage_set # possible_values: [44.0,45.0,46.0,47.0,48.0,49.0,49.0,50.0,51.0] number: ######## Thresholds Axpert ######## - platform: template name: Bulk charge voltage id: ${name}_${inverter}_battery_bulk_voltage_number optimistic: true unit_of_measurement: 'V' icon: mdi:sine-wave min_value: 26.5 max_value: 29.0 step: 0.1 initial_value: 27.5 restore_value: true mode: 'slider' on_value: then: - output.pipsolar.set_level: id: ${name}_${inverter}_battery_bulk_voltage_set value: !lambda return (float(id(${name}_${inverter}_battery_bulk_voltage_number).state)); - platform: template name: Float charge voltage id: ${name}_${inverter}_battery_float_voltage_number optimistic: true unit_of_measurement: 'V' icon: mdi:sine-wave min_value: 26.0 max_value: 27.4 step: 0.1 initial_value: 26.9 restore_value: true mode: 'slider' on_value: then: - output.pipsolar.set_level: id: ${name}_${inverter}_battery_float_voltage_set value: !lambda return (float(id(${name}_${inverter}_battery_float_voltage_number).state)); - platform: template name: Cutoff voltage id: ${name}_${inverter}_battery_under_voltage_number optimistic: true unit_of_measurement: 'V' icon: mdi:sine-wave min_value: 21.0 max_value: 24.0 step: 0.1 initial_value: 24.0 restore_value: true mode: 'slider' on_value: then: - output.pipsolar.set_level: id: ${name}_${inverter}_battery_under_voltage_set value: !lambda return (id(${name}_${inverter}_battery_under_voltage_number).state); # - platform: template # name: Recharge voltage # id: ${name}_${inverter}_battery_recharge_voltage_number # optimistic: true # unit_of_measurement: 'V' # icon: mdi:sine-wave # min_value: 44.0 # max_value: 51.0 # step: 1.0 # initial_value: 48.0 # restore_value: true # mode: 'slider' # on_value: # then: # - output.pipsolar.set_level: # id: ${name}_${inverter}_battery_recharge_voltage_set # value: !lambda return (id(${name}_${inverter}_battery_recharge_voltage_number).state); ######### Joshua's Bulk Charging Parameters ######## - platform: template name: Set float stage voltage id: ${name}_${inverter}_set_float_stage_voltage optimistic: true unit_of_measurement: 'V' icon: mdi:power-plug-battery-outline min_value: 26.5 max_value: 27.5 step: 0.1 initial_value: 26.9 restore_value: true mode: 'slider' - platform: template name: Switch to bulk current id: ${name}_${inverter}_switch_to_bulk_charge_current optimistic: true unit_of_measurement: 'A' icon: mdi:power-plug-battery-outline min_value: 1 max_value: 10 step: 1 initial_value: 3 restore_value: true mode: 'slider' - platform: template name: Switch to float current id: ${name}_${inverter}_switch_to_float_charge_current optimistic: true unit_of_measurement: 'A' icon: mdi:power-plug-battery-outline min_value: 2 max_value: 10 step: 1 initial_value: 4 restore_value: true mode: 'slider' switch: - platform: restart name: "ESP Restart" sensor: - platform: wifi_signal name: "WiFi Signal" id: rssi_sensor update_interval: 15s # - platform: template # name: "WiFi Quality" # unit_of_measurement: "%" # accuracy_decimals: 0 # icon: "mdi:wifi" # update_interval: 15s # lambda: |- # int quality; # const int rssi = id(rssi_sensor).state; # if (rssi <= -100) { quality = 0;} # else if (rssi >= -50) # { quality = 100; } # else # { quality = 2 * (rssi + 100); } # return quality; - platform: uptime id: uptime_sec update_interval: 30s - platform: pipsolar pipsolar_id: pip8048 # grid_rating_voltage: # id: ${name}_${inverter}_grid_rating_voltage # name: ${name}_${inverter}_grid_rating_voltage # grid_rating_current: # id: ${name}_${inverter}_grid_rating_current # name: ${name}_${inverter}_grid_rating_current # ac_output_rating_voltage: # id: ${name}_${inverter}_ac_output_rating_voltage # name: ${name}_${inverter}_ac_output_rating_voltage # ac_output_rating_frequency: # id: ${name}_${inverter}_ac_output_rating_frequency # name: ${name}_${inverter}_ac_output_rating_frequency # ac_output_rating_current: # id: ${name}_${inverter}_ac_output_rating_current # name: ${name}_${inverter}_ac_output_rating_current # ac_output_rating_apparent_power: # id: ${name}_${inverter}_ac_output_rating_apparent_power # name: ${name}_${inverter}_ac_output_rating_apparent_power # ac_output_rating_active_power: # id: ${name}_${inverter}_ac_output_rating_active_power # name: ${name}_${inverter}_ac_output_rating_active_power # battery_rating_voltage: # id: ${name}_${inverter}_battery_rating_voltage # name: "Inverter rated battery voltage" # battery_recharge_voltage: # id: ${name}_${inverter}_battery_recharge_voltage # name: "Recharge voltage" # battery_under_voltage: # id: ${name}_${inverter}_battery_under_voltage # name: "Battery cutoff voltage" battery_bulk_voltage: id: ${name}_${inverter}_battery_bulk_voltage name: "Bulk voltage" battery_float_voltage: id: ${name}_${inverter}_battery_float_voltage name: "Float voltage" # battery_type: # id: ${name}_${inverter}_battery_type #name: ${name}_${inverter}_battery_type # battery_redischarge_voltage: # id: ${name}_${inverter}_battery_redischarge_voltage # name: "Redischarge voltage" # current_max_ac_charging_current: # id: ${name}_${inverter}_current_max_ac_charging_current # name: "Inverter max AC charging current" # current_max_charging_current: # id: ${name}_${inverter}_current_max_charging_current # name: "Max charging current" # output_source_priority: # id: ${name}_${inverter}_output_source_priority # name: "Output source priority" # output_mode: # id: ${name}_${inverter}_output_mode # name: "Inverter output_mode" output_load_percent: id: ${name}_${inverter}_output_load_percent name: "Inverter load" accuracy_decimals: 0 # charger_source_priority: # id: ${name}_${inverter}_charger_source_priority # name: "Charger source priority" grid_voltage: id: ${name}_${inverter}_grid_voltage name: "Grid voltage" # grid_frequency: # id: ${name}_${inverter}_grid_frequency # name: ${name}_${inverter}_grid_frequency ac_output_voltage: id: ${name}_${inverter}_ac_output_voltage name: "AC output voltage" # ac_output_frequency: # id: ${name}_${inverter}_ac_output_frequency # name: ${name}_${inverter}_ac_output_frequency ac_output_apparent_power: id: ${name}_${inverter}_ac_output_apparent_power name: "AC output VA" accuracy_decimals: 0 ac_output_active_power: id: ${name}_${inverter}_ac_output_active_power name: "AC output power" accuracy_decimals: 0 # bus_voltage: # id: ${name}_${inverter}_bus_voltage # name: "Inverter bus voltage" battery_voltage: id: ${name}_${inverter}_battery_voltage name: "Battery voltage" battery_charging_current: id: ${name}_${inverter}_battery_charging_current name: "Battery charge current" accuracy_decimals: 0 on_value_range: - below: !lambda return (id(${name}_${inverter}_switch_to_float_charge_current).state); then: - if: condition: lambda: return ((float(id(${name}_${inverter}_set_float_stage_voltage).state)) != (float(id(${name}_${inverter}_battery_float_voltage).state))); then: - output.pipsolar.set_level: id: ${name}_${inverter}_battery_float_voltage_set value: !lambda return (float(id(${name}_${inverter}_set_float_stage_voltage).state)); - above: !lambda return (id(${name}_${inverter}_switch_to_bulk_charge_current).state); then: - if: condition: lambda: return (float(id(${name}_${inverter}_battery_bulk_voltage).state)) != (float(id(${name}_${inverter}_battery_float_voltage).state)); then: - output.pipsolar.set_level: id: ${name}_${inverter}_battery_float_voltage_set value: !lambda return (float(id(${name}_${inverter}_battery_bulk_voltage).state)); # # battery_capacity_percent: # # id: ${name}_${inverter}_battery_capacity_percent # # name: "Inverter battery capacity percent" # battery_voltage_scc: # id: ${name}_${inverter}_battery_voltage_scc # name: "Inverter battery voltage scc" battery_discharge_current: id: ${name}_${inverter}_battery_discharge_current name: "Discharge current" # battery_voltage_offset_for_fans_on: # id: ${name}_${inverter}_battery_voltage_offset_for_fans_on # name: "Inverter battery voltage offset for fans on" inverter_heat_sink_temperature: id: ${name}_${inverter}_inverter_heat_sink_temperature name: "Inverter temperature" accuracy_decimals: 0 # add_sbu_priority_version: # id: ${name}_${inverter}_add_sbu_priority_version # name: ${name}_${inverter}_add_sbu_priority_version # eeprom_version: # id: ${name}_${inverter}_eeprom_version # name: ${name}_${inverter}_eeprom_version # scc_firmware_version: # id: ${name}_${inverter}_scc_firmware_version # name: ${name}_${inverter}_scc_firmware_version # pv1_input_current: # id: ${name}_${inverter}_pv1_input_current # name: "PV input current" # pv1_input_voltage: # id: ${name}_${inverter}_pv1_input_voltage # name: "PV input voltage" # pv1_charging_power: # id: ${name}_${inverter}_pv1_charging_power # name: "PV charging power" # - platform: total_daily_energy # name: PV power total today # power_id: ${name}_${inverter}_pv1_charging_power # unit_of_measurement: "kWh" # accuracy_decimals: 2 # id: ${name}_${inverter}_PV1_power_total_today # method: trapezoid # filters: # # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # icon: mdi:counter # - platform: total_daily_energy # name: ${name}_${inverter}_PV2_power_total_today # power_id: ${name}_${inverter}_pv2_charging_power # unit_of_measurement: "kWh" # accuracy_decimals: 2 # id: ${name}_${inverter}_PV2_power_total_today # method: trapezoid # filters: # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # icon: mdi:counter # - platform: template # name: PV power total # id: ${name}_${inverter}_PV_power_total # unit_of_measurement: "W" # accuracy_decimals: 1 # update_interval: ${template_update} # icon: mdi:power # lambda: return (id(${name}_${inverter}_pv1_charging_power).state); # - platform: total_daily_energy # name: PV power total today # power_id: ${name}_${inverter}_PV_power_total # unit_of_measurement: "kWh" # accuracy_decimals: 3 # id: ${name}_${inverter}_PV_power_total_today # method: trapezoid # filters: # # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # icon: mdi:counter # - platform: template # name: PV power total yesterday # id: template_${name}_${inverter}_PV_power_total_yesterday # unit_of_measurement: "kwh" # accuracy_decimals: 3 # icon: mdi:power # update_interval: ${template_update} # lambda: |- # return ( id(template_${name}_${inverter}_PV_power_total_yesterday).state = id(${name}_${inverter}_PV_power_total_yesterday_global) ); - platform: total_daily_energy name: AC output power today power_id: ${name}_${inverter}_ac_output_active_power unit_of_measurement: "kWh" accuracy_decimals: 3 id: ${name}_${inverter}_ac_output_active_power_total_today method: trapezoid filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 icon: mdi:counter - platform: template name: AC output power yesterday id: template_${name}_${inverter}_ac_output_active_power_yesterday unit_of_measurement: "kwh" accuracy_decimals: 3 icon: mdi:power update_interval: ${template_update} lambda: |- return ( id(template_${name}_${inverter}_ac_output_active_power_yesterday).state = id(${name}_${inverter}_ac_output_active_power_yesterday_global) ); - platform: template name: Battery charging power id: ${name}_${inverter}_battery_charging_power unit_of_measurement: "W" accuracy_decimals: 3 update_interval: ${template_update} icon: mdi:power lambda: return ( (id(${name}_${inverter}_battery_voltage).state) * (id(${name}_${inverter}_battery_charging_current).state) ); - platform: total_daily_energy name: Battery charged power today power_id: ${name}_${inverter}_battery_charging_power unit_of_measurement: "kWh" accuracy_decimals: 3 id: ${name}_${inverter}_battery_charging_power_total_today method: trapezoid filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 icon: mdi:counter - platform: template name: Battery charged power yesterday id: template_${name}_${inverter}_battery_charging_power_yesterday unit_of_measurement: "kwh" accuracy_decimals: 3 icon: mdi:power update_interval: ${template_update} lambda: |- return ( id(template_${name}_${inverter}_battery_charging_power_yesterday).state = id(${name}_${inverter}_battery_charging_power_yesterday_global) ); - platform: template name: Battery discharging power id: ${name}_${inverter}_battery_discharging_power unit_of_measurement: "W" accuracy_decimals: 3 update_interval: ${template_update} icon: mdi:power lambda: return ( (id(${name}_${inverter}_battery_voltage).state) * (id(${name}_${inverter}_battery_discharge_current).state) ); - platform: total_daily_energy name: Battery discharged power today power_id: ${name}_${inverter}_battery_discharging_power unit_of_measurement: "kWh" accuracy_decimals: 3 id: ${name}_${inverter}_battery_discharging_power_total_today method: trapezoid filters: # Multiplication factor from W to kW is 0.001 - multiply: 0.001 icon: mdi:counter - platform: template name: Battery discharged power yesterday id: template_${name}_${inverter}_battery_discharging_power_yesterday unit_of_measurement: "kwh" accuracy_decimals: 3 icon: mdi:power update_interval: ${template_update} lambda: |- return ( id(template_${name}_${inverter}_battery_discharging_power_yesterday).state = id(${name}_${inverter}_battery_discharging_power_yesterday_global) ); # - platform: template # name: ${name}_${smartshunt}_battery_charging_power # id: ${name}_${smartshunt}_battery_charging_power # unit_of_measurement: "W" # accuracy_decimals: 3 # update_interval: ${template_update} # icon: mdi:power # lambda: |- # if (float(id(${name}_${smartshunt}_battery_current).state)> 0){ # return ( (id(${name}_${smartshunt}_battery_voltage).state) * (id(${name}_${smartshunt}_battery_current).state) ); # } # else { # return 0.0; # } # - platform: total_daily_energy # name: ${name}_${smartshunt}_battery_charging_power_total_today # power_id: ${name}_${smartshunt}_battery_charging_power # unit_of_measurement: "kWh" # accuracy_decimals: 3 # id: ${name}_${smartshunt}_battery_charging_power_total_today # method: trapezoid # filters: # # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # icon: mdi:counter # - platform: template # name: ${name}_${smartshunt}_battery_charging_power_yesterday # id: template_${name}_${smartshunt}_battery_charging_power_yesterday # unit_of_measurement: "kwh" # accuracy_decimals: 3 # icon: mdi:power # update_interval: ${template_update} # lambda: |- # return ( id(template_${name}_${smartshunt}_battery_charging_power_yesterday).state = id(${name}_${smartshunt}_battery_charging_power_yesterday_global) ); # - platform: template # name: ${name}_${smartshunt}_battery_discharging_current # id: ${name}_${smartshunt}_battery_discharging_current # unit_of_measurement: "A" # accuracy_decimals: 3 # update_interval: ${template_update} # icon: mdi:current-dc # lambda: |- # if (float(id(${name}_${smartshunt}_battery_current).state)< 0){ # return ( (id(${name}_${smartshunt}_battery_current).state) ); # } # else { # return 0.0; # } # - platform: template # name: ${name}_${smartshunt}_battery_discharging_power # id: ${name}_${smartshunt}_battery_discharging_power # unit_of_measurement: "W" # accuracy_decimals: 3 # update_interval: ${template_update} # icon: mdi:power # lambda: |- # if (float(id(${name}_${smartshunt}_battery_current).state) < 0){ # return ( -(id(${name}_${smartshunt}_battery_voltage).state) * (id(${name}_${smartshunt}_battery_current).state) ); # } # else { # return 0.0; # } # - platform: total_daily_energy # name: ${name}_${smartshunt}_battery_discharging_power_total_today # power_id: ${name}_${smartshunt}_battery_discharging_power # unit_of_measurement: "kWh" # accuracy_decimals: 3 # id: ${name}_${smartshunt}_battery_discharging_power_total_today # method: trapezoid # filters: # # Multiplication factor from W to kW is 0.001 # - multiply: 0.001 # icon: mdi:counter # - platform: template # name: ${name}_${smartshunt}_battery_discharging_power_yesterday # id: template_${name}_${smartshunt}_battery_discharging_power_yesterday # unit_of_measurement: "kwh" # accuracy_decimals: 3 # icon: mdi:power # update_interval: ${template_update} # lambda: |- # return ( id(template_${name}_${smartshunt}_battery_discharging_power_yesterday).state = id(${name}_${smartshunt}_battery_discharging_power_yesterday_global) ); # binary_sensor: # - platform: pipsolar # pipsolar_id: pip8048 # warning_battery_equalization: # id: ${name}_${inverter}_warning_battery_equalization # name: "Battery Equalization Status" # # configuration_status: # # name: "Inverter configuration status" # # scc_firmware_version: # # name: "${name} scc_firmware_version" # # load_status: # # name: "Inverter load status" # # battery_voltage_to_steady_while_charging: # # name: "pvbrain_axpert_battery_voltage_to_steady_while_charging" # # charging_status: # # name: "Invert charging status" # # scc_charging_status: # # name: "Inverter SCC charging status" # # ac_charging_status: # # name: "Inverter AC charging status" # # charging_to_floating_mode: # # name: "pvbrain_axpert_charging_to_floating_mode" # switch_on: # name: "Inverter switch on" # id: ${name}_${inverter}_switch_on text_sensor: - platform: template name: "Current time" lambda: |- char str[17]; time_t currTime = id(my_time).now().timestamp; strftime(str, sizeof(str), "%H:%M", localtime(&currTime)); return { str }; update_interval: 30s - platform: template name: "ESP Uptime" lambda: |- int seconds = (id(uptime_sec).state); int days = seconds / (24 * 3600); seconds = seconds % (24 * 3600); int hours = seconds / 3600; seconds = seconds % 3600; int minutes = seconds / 60; seconds = seconds % 60; if ( days ) { return { (std::to_string(days) +"d " + std::to_string(hours) +"h " + std::to_string(minutes) +"m").c_str() }; } else if ( hours ) { return { (std::to_string(hours) +"h " + std::to_string(minutes) +"m").c_str() }; } else if ( minutes ) { return { (std::to_string(minutes) +"m "+ std::to_string(seconds) +"s ").c_str() }; } else { return { (std::to_string(seconds) +"s ").c_str() }; } icon: mdi:clock-start update_interval: 30s select: - platform: pipsolar pipsolar_id: pip8048 output_source_priority: id: ${name}_${inverter}_output_source_priority_select name: "Output source priority" icon: mdi:numeric optionsmap: "Utility first": "POP00" "Solar only": "POP01" "Solar Battery Utility": "POP02" statusmap: "0": "Utility first" "1": "Solar only" "2": "Solar Battery Utility" # For HS: 00 for utility first, 01 for solar first, 02 for solar and utility, 03 for only solar charging - platform: pipsolar pipsolar_id: pip8048 charger_source_priority: id: ${name}_${inverter}_charger_source_priority_select name: "Charger source priority" icon: mdi:numeric optionsmap: # "Utility first": "PCP00" "Solar first": "PCP01" "Solar and utility": "PCP02" "Solar charging only": "PCP03" statusmap: # "0": "Utility first" "1": "Solar first" "2": "Solar and utility" "3": "Solar charging only" - platform: pipsolar pipsolar_id: pip8048 current_max_ac_charging_current: id: ${name}_${inverter}_current_max_ac_charging_current_select name: Max AC charge current icon: mdi:current-dc optionsmap: "2A": "MUCHGC002" "10A": "MUCHGC010" "20A": "MUCHGC020" "30A": "MUCHGC030" "40A": "MUCHGC040" "50A": "MUCHGC050" statusmap: "2": "2A" "10": "10A" "20": "20A" "30": "30A" "40": "40A" "50": "50A" "60": "60A" "70": "70A" "80": "80A" "90": "90A" "100": "100A" "110": "110A" "120": "120A" - platform: pipsolar pipsolar_id: pip8048 current_max_charging_current: id: ${name}_${inverter}_current_max_charging_current_select name: Max total charge current icon: mdi:current-dc optionsmap: "10A": "MNCHGC010" "20A": "MNCHGC020" "30A": "MNCHGC030" "40A": "MNCHGC040" "50A": "MNCHGC050" statusmap: "10": "10A" "20": "20A" "30": "30A" "40": "40A" "50": "50A" "60": "60A" "70": "70A" "80": "80A" "90": "90A" "100": "100A" "110": "110A" "120": "120A"
-
Logic reacted to Coulomb in Premature Float Bug in RCT Axpert VMII 2.5kVA - Seeking Guidance on Modifying Latest Firmware for LiFePo4 BatteriesNo, there is nothing like that. It's a quite complex matter to patch firmware. It's not a matter of updating a few hex values. To support LFP batteries properly, Weber and I had to write extensive changes in DSP assembly language, something that few programmers are able to do any more. The original firmware was written in the C language, itself becoming less known by many programmers as the years go by. Then there is the tedium of merging long strings of hex, getting the checksums correct, and testing and debugging the code.
Finally, there is the issue of clone makers (we don't want to make it easier for them to steal firmware) and copyright of Voltronic Power's intellectual property (the firmware). So we can't publish exactly how we do the patching, or disassemblies of the firmware.
I'm happy to help genuine fellow patchers, of course, but there are very few of these.