From c9eba7dad6e333331bcbb3fe3646a0dbd7a044b3 Mon Sep 17 00:00:00 2001 From: Richie Cahill Date: Sat, 24 Oct 2026 20:30:13 -0400 Subject: [PATCH] upgraded van to a MultiPlus-II --- systems/brain/services/home_assistant.nix | 1 + .../home_assistant/dashboard_overview.yaml | 122 ---- .../home_assistant/victron_modbuss.yaml | 675 +++++++++++++++--- 3 files changed, 596 insertions(+), 202 deletions(-) delete mode 100644 systems/brain/services/home_assistant/dashboard_overview.yaml diff --git a/systems/brain/services/home_assistant.nix b/systems/brain/services/home_assistant.nix index 77ab6a3..371f8eb 100644 --- a/systems/brain/services/home_assistant.nix +++ b/systems/brain/services/home_assistant.nix @@ -82,6 +82,7 @@ extraComponents = [ "isal" "modbus" # for victron modbus integration + "template" # MultiPlus mode selector, input current limit and derived sensors ]; customComponents = with pkgs.x86-v1.home-assistant-custom-components; [ garmin_connect diff --git a/systems/brain/services/home_assistant/dashboard_overview.yaml b/systems/brain/services/home_assistant/dashboard_overview.yaml deleted file mode 100644 index 4057950..0000000 --- a/systems/brain/services/home_assistant/dashboard_overview.yaml +++ /dev/null @@ -1,122 +0,0 @@ -title: Van Overview -views: - - title: Overview - path: overview - type: sections - sections: - # Battery Status Section - - type: grid - title: Battery Status - cards: - - type: gauge - entity: sensor.jk0_soc - name: Battery 0 - min: 0 - max: 100 - severity: - green: 50 - yellow: 20 - red: 0 - needle: true - - - type: gauge - entity: sensor.jk1_soc - name: Battery 1 - min: 0 - max: 100 - severity: - green: 50 - yellow: 20 - red: 0 - needle: true - - - type: entity - entity: sensor.jk0_total_voltage - name: Batt 0 Voltage - - - type: entity - entity: sensor.jk1_total_voltage - name: Batt 1 Voltage - - # Solar Production Section - - type: grid - title: Solar Production - cards: - - type: gauge - entity: sensor.solar_wattage - name: Solar Now - min: 0 - max: 400 - severity: - green: 100 - yellow: 50 - red: 0 - needle: true - - - type: entity - entity: sensor.solar_yield_today - name: Today's Yield - - - type: entity - entity: sensor.estimated_energy_production_today - name: Forecast Today - - - type: entity - entity: sensor.estimated_energy_production_tomorrow - name: Forecast Tomorrow - - # Environment Section - - type: grid - title: Van Environment - cards: - - type: entity - entity: sensor.environment_temperature - name: Inside Temp - - - type: entity - entity: sensor.environment_humidity - name: Inside Humidity - - - type: entity - entity: sensor.current_weather_temperature - name: Outside Temp - - - type: entity - entity: sensor.current_weather_humidity - name: Outside Humidity - - - type: entity - entity: sensor.current_weather_condition - name: Weather - - # Charger Status Section - - type: grid - title: Charger - cards: - - type: entity - entity: sensor.charger_dc_wattage - name: Charging Power - - - type: entity - entity: sensor.charger_charge_state - name: Charge State - - - type: entity - entity: sensor.charger_dc_wattage_daily - name: Charged Today - - # Location Section - - type: grid - title: Location - cards: - - type: entity - entity: sensor.gps_location - name: Current Location - - - type: entity - entity: sensor.gps_speed - name: Speed - - - type: entity - entity: binary_sensor.gps_fix_available - name: GPS Fix diff --git a/systems/brain/services/home_assistant/victron_modbuss.yaml b/systems/brain/services/home_assistant/victron_modbuss.yaml index 55ae346..12a864b 100644 --- a/systems/brain/services/home_assistant/victron_modbuss.yaml +++ b/systems/brain/services/home_assistant/victron_modbuss.yaml @@ -220,10 +220,120 @@ modbus: state_class: measurement unique_id: gps_altitude_id_1 - # ---- CHARGER (Unit ID 223) ---- - - name: Charger Output 1 Voltage - slave: 223 - address: 2307 + # ---- MULTIPLUS-II (VE.Bus, Cerbo GX unit ID 227) ---- + # Confirmed on this GX: one AC phase, AC input 1, 30 A shore-power plug. + # Register map: https://www.victronenergy.com/upload/documents/CCGX-Modbus-TCP-register-list-3.81.xlsx + # Victron's scale column is a divisor: AC power registers use 0.1, + # so Home Assistant must multiply their signed raw values by 10. + # Change the unit ID anchor here if the GX service mapping changes. + - name: MultiPlus AC Input Voltage + unique_id: multiplus_ac_input_voltage + slave: &multiplus_unit_id 227 + address: 3 + input_type: holding + data_type: uint16 + scale: 0.1 + precision: 1 + unit_of_measurement: "V" + device_class: voltage + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Input Current + unique_id: multiplus_ac_input_current + slave: *multiplus_unit_id + address: 6 + input_type: holding + data_type: int16 + scale: 0.1 + precision: 1 + unit_of_measurement: "A" + device_class: current + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Input Frequency + unique_id: multiplus_ac_input_frequency + slave: *multiplus_unit_id + address: 9 + input_type: holding + data_type: int16 + scale: 0.01 + precision: 2 + unit_of_measurement: "Hz" + device_class: frequency + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Input Power + unique_id: multiplus_ac_input_power + slave: *multiplus_unit_id + address: 12 + input_type: holding + data_type: int16 + scale: 10 + precision: 0 + unit_of_measurement: "W" + device_class: power + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Output Voltage + unique_id: multiplus_ac_output_voltage + slave: *multiplus_unit_id + address: 15 + input_type: holding + data_type: uint16 + scale: 0.1 + precision: 1 + unit_of_measurement: "V" + device_class: voltage + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Output Current + unique_id: multiplus_ac_output_current + slave: *multiplus_unit_id + address: 18 + input_type: holding + data_type: int16 + scale: 0.1 + precision: 1 + unit_of_measurement: "A" + device_class: current + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Output Frequency + unique_id: multiplus_ac_output_frequency + slave: *multiplus_unit_id + address: 21 + input_type: holding + data_type: int16 + scale: 0.01 + precision: 2 + unit_of_measurement: "Hz" + device_class: frequency + state_class: measurement + scan_interval: 10 + + - name: MultiPlus AC Output Power + unique_id: multiplus_ac_output_power + slave: *multiplus_unit_id + address: 23 + input_type: holding + data_type: int16 + scale: 10 + precision: 0 + unit_of_measurement: "W" + device_class: power + state_class: measurement + scan_interval: 10 + + - name: MultiPlus Battery Voltage + unique_id: multiplus_battery_voltage + slave: *multiplus_unit_id + address: 26 input_type: holding data_type: uint16 scale: 0.01 @@ -231,11 +341,12 @@ modbus: unit_of_measurement: "V" device_class: voltage state_class: measurement - unique_id: charger_output_1_voltage + scan_interval: 10 - - name: Charger Output 1 Current - slave: 223 - address: 2308 + - name: MultiPlus Battery Current + unique_id: multiplus_battery_current + slave: *multiplus_unit_id + address: 27 input_type: holding data_type: int16 scale: 0.1 @@ -243,11 +354,12 @@ modbus: unit_of_measurement: "A" device_class: current state_class: measurement - unique_id: charger_output_1_current + scan_interval: 10 - - name: Charger Output 1 Temperature - slave: 223 - address: 2309 + - name: MultiPlus Battery Temperature + unique_id: multiplus_battery_temperature + slave: *multiplus_unit_id + address: 61 input_type: holding data_type: int16 scale: 0.1 @@ -255,11 +367,23 @@ modbus: unit_of_measurement: "°C" device_class: temperature state_class: measurement - unique_id: charger_output_1_temperature - - name: Charger AC Current - slave: 223 - address: 2314 + - name: MultiPlus State of Charge + unique_id: multiplus_state_of_charge + slave: *multiplus_unit_id + address: 30 + input_type: holding + data_type: uint16 + scale: 0.1 + precision: 1 + unit_of_measurement: "%" + device_class: battery + state_class: measurement + + - name: MultiPlus AC Input Current Limit Readback + unique_id: multiplus_ac_input_current_limit_readback + slave: *multiplus_unit_id + address: 22 input_type: holding data_type: int16 scale: 0.1 @@ -267,73 +391,272 @@ modbus: unit_of_measurement: "A" device_class: current state_class: measurement - unique_id: charger_ac_current + scan_interval: 10 - - name: Charger AC Current Limit - slave: 223 - address: 2316 - input_type: holding - data_type: int16 - scale: 0.1 - precision: 1 - unit_of_measurement: "A" - device_class: current - state_class: measurement - unique_id: charger_ac_current_limit - - - name: Charger On Off Raw - slave: 223 - address: 2317 + - name: MultiPlus Mode Raw + unique_id: multiplus_mode_raw + slave: *multiplus_unit_id + address: 33 input_type: holding data_type: uint16 - scale: 1 - state_class: measurement - unique_id: charger_on_off_raw + scan_interval: 10 - - name: Charger Charge State Raw - slave: 223 - address: 2318 + - name: MultiPlus State Raw + unique_id: multiplus_state_raw + slave: *multiplus_unit_id + address: 31 input_type: holding data_type: uint16 - scale: 1 - state_class: measurement - unique_id: charger_charge_state_raw + scan_interval: 10 - - name: Charger Error Code - slave: 223 - address: 2319 + - name: MultiPlus Charge State Raw + unique_id: multiplus_charge_state_raw + slave: *multiplus_unit_id + address: 95 input_type: holding data_type: uint16 - scale: 1 - state_class: measurement - unique_id: charger_error_code + scan_interval: 10 - - name: Charger Relay State - slave: 223 - address: 2320 + - name: MultiPlus Active Input Raw + unique_id: multiplus_active_input_raw + slave: *multiplus_unit_id + address: 29 input_type: holding data_type: uint16 - scale: 1 - state_class: measurement - unique_id: charger_relay_state + scan_interval: 10 - - name: Charger Low Voltage Alarm - slave: 223 - address: 2321 + - name: MultiPlus Phase Count + unique_id: multiplus_phase_count + slave: *multiplus_unit_id + address: 28 input_type: holding data_type: uint16 - scale: 1 - state_class: measurement - unique_id: charger_low_voltage_alarm - - name: Charger High Voltage Alarm - slave: 223 - address: 2322 + - name: MultiPlus VE Bus Error + unique_id: multiplus_ve_bus_error + slave: *multiplus_unit_id + address: 32 input_type: holding data_type: uint16 + + - name: MultiPlus High Temperature Alarm Raw + unique_id: multiplus_high_temperature_alarm_raw + slave: *multiplus_unit_id + address: 34 + input_type: holding + data_type: uint16 + + - name: MultiPlus Low Battery Alarm Raw + unique_id: multiplus_low_battery_alarm_raw + slave: *multiplus_unit_id + address: 35 + input_type: holding + data_type: uint16 + + - name: MultiPlus Overload Alarm Raw + unique_id: multiplus_overload_alarm_raw + slave: *multiplus_unit_id + address: 36 + input_type: holding + data_type: uint16 + + - name: MultiPlus Ripple Alarm Raw + unique_id: multiplus_ripple_alarm_raw + slave: *multiplus_unit_id + address: 47 + input_type: holding + data_type: uint16 + + - name: MultiPlus Temperature Sensor Alarm Raw + unique_id: multiplus_temperature_sensor_alarm_raw + slave: *multiplus_unit_id + address: 42 + input_type: holding + data_type: uint16 + + - name: MultiPlus Voltage Sensor Alarm Raw + unique_id: multiplus_voltage_sensor_alarm_raw + slave: *multiplus_unit_id + address: 43 + input_type: holding + data_type: uint16 + + - name: MultiPlus Grid Lost Alarm Raw + unique_id: multiplus_grid_lost_alarm_raw + slave: *multiplus_unit_id + address: 64 + input_type: holding + data_type: uint16 + + - name: MultiPlus BMS Pre Alarm Raw + unique_id: multiplus_bms_pre_alarm_raw + slave: *multiplus_unit_id + address: 94 + input_type: holding + data_type: uint16 + + - name: MultiPlus BMS Allows Charging Raw + unique_id: multiplus_bms_allows_charging_raw + slave: *multiplus_unit_id + address: 57 + input_type: holding + data_type: uint16 + + - name: MultiPlus BMS Allows Discharging Raw + unique_id: multiplus_bms_allows_discharging_raw + slave: *multiplus_unit_id + address: 58 + input_type: holding + data_type: uint16 + + - name: MultiPlus BMS Expected Raw + unique_id: multiplus_bms_expected_raw + slave: *multiplus_unit_id + address: 59 + input_type: holding + data_type: uint16 + + - name: MultiPlus BMS Error + unique_id: multiplus_bms_error + slave: *multiplus_unit_id + address: 60 + input_type: holding + data_type: uint16 + + - name: MultiPlus AC Input Ignored Raw + unique_id: multiplus_ac_input_ignored_raw + slave: *multiplus_unit_id + address: 69 + input_type: holding + data_type: uint16 + + - name: MultiPlus AC Input to Output Energy + unique_id: multiplus_ac_input_to_output_energy + slave: *multiplus_unit_id + address: 74 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + # Hardware counters reset on Multi/GX restart; total_increasing handles this. + + - name: MultiPlus AC Input to Battery Energy + unique_id: multiplus_ac_input_to_battery_energy + slave: *multiplus_unit_id + address: 76 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - name: MultiPlus AC Output to Input Energy + unique_id: multiplus_ac_output_to_input_energy + slave: *multiplus_unit_id + address: 82 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - name: MultiPlus Battery to AC Input Energy + unique_id: multiplus_battery_to_ac_input_energy + slave: *multiplus_unit_id + address: 86 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - name: MultiPlus Battery to AC Output Energy + unique_id: multiplus_battery_to_ac_output_energy + slave: *multiplus_unit_id + address: 90 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - name: MultiPlus AC Output to Battery Energy + unique_id: multiplus_ac_output_to_battery_energy + slave: *multiplus_unit_id + address: 92 + input_type: holding + data_type: uint32 + scale: 0.01 + precision: 2 + unit_of_measurement: "kWh" + device_class: energy + state_class: total_increasing + + - name: MultiPlus PowerAssist Boost Factor + unique_id: multiplus_powerassist_boost_factor + slave: *multiplus_unit_id + address: 106 + input_type: holding + data_type: uint16 + scale: 0.01 + precision: 2 + state_class: measurement + + - name: MultiPlus Configured Output Voltage + unique_id: multiplus_configured_output_voltage + slave: *multiplus_unit_id + address: 107 + input_type: holding + data_type: uint16 + scale: 0.01 + precision: 2 + unit_of_measurement: "V" + device_class: voltage + state_class: measurement + + - name: MultiPlus PowerAssist Enabled Raw + unique_id: multiplus_powerassist_enabled_raw + slave: *multiplus_unit_id + address: 108 + input_type: holding + data_type: uint16 + + - name: MultiPlus UPS Function Raw + unique_id: multiplus_ups_function_raw + slave: *multiplus_unit_id + address: 109 + input_type: holding + data_type: uint16 + + - name: MultiPlus Weak AC Input Raw + unique_id: multiplus_weak_ac_input_raw + slave: *multiplus_unit_id + address: 129 + input_type: holding + data_type: uint16 + + - name: MultiPlus Nominal Inverter Power + unique_id: multiplus_nominal_inverter_power + slave: *multiplus_unit_id + address: 130 + input_type: holding + data_type: uint32 scale: 1 + precision: 0 + unit_of_measurement: "W" + device_class: power state_class: measurement - unique_id: charger_high_voltage_alarm template: - sensor: @@ -439,34 +762,208 @@ template: {{ v100 }} {% endif %} - - name: Charger On Off + - name: MultiPlus State + unique_id: multiplus_state + availability: "{{ is_number(states('sensor.multiplus_state_raw')) }}" state: >- - {% set v = states('sensor.charger_on_off_raw')|int %} - {{ {0:'Off',1:'On',2:'Error',3:'Unavailable'}.get(v, 'Unknown') }} - - - name: Charger Charge State - state: >- - {% set v = states('sensor.charger_charge_state_raw')|int %} + {% set v = states('sensor.multiplus_state_raw') | int(-1) %} {{ { - 0:'Off',1:'Low Power',2:'Fault',3:'Bulk',4:'Absorption',5:'Float', - 6:'Storage',7:'Equalize/Manual',8:'External Control' - }.get(v,'Unknown') }} + 0:'Off',1:'Low power',2:'Fault',3:'Bulk',4:'Absorption',5:'Float', + 6:'Storage',7:'Equalize',8:'Pass-through',9:'Inverting', + 10:'PowerAssist',11:'Power supply',244:'Sustain',252:'External control' + }.get(v, 'Unknown') }} + + # Keep the existing charger entities and energy history. + - name: Charger Charge State + availability: "{{ is_number(states('sensor.multiplus_charge_state_raw')) }}" + state: >- + {% set v = states('sensor.multiplus_charge_state_raw') | int(-1) %} + {{ { + 0:'Initialising',1:'Bulk',2:'Absorption',3:'Float',4:'Storage', + 5:'Absorption repeat',6:'Forced absorption',7:'Equalize', + 8:'Bulk stopped',9:'Unknown' + }.get(v, 'Unknown') }} + + - name: MultiPlus Active Input + unique_id: multiplus_active_input + availability: "{{ is_number(states('sensor.multiplus_active_input_raw')) }}" + state: >- + {{ {0:'AC input 1',1:'AC input 2',240:'Disconnected'} + .get(states('sensor.multiplus_active_input_raw') | int(-1), 'Unknown') }} + + # VE.Bus DC current is positive while charging and negative while inverting. + - name: MultiPlus DC Power + unique_id: multiplus_dc_power + unit_of_measurement: "W" + device_class: power + state_class: measurement + availability: >- + {{ is_number(states('sensor.multiplus_battery_voltage')) + and is_number(states('sensor.multiplus_battery_current')) }} + state: >- + {{ (states('sensor.multiplus_battery_voltage') | float(0) + * states('sensor.multiplus_battery_current') | float(0)) | round(1) }} - name: "Charger DC Wattage" unique_id: charger_dc_wattage unit_of_measurement: "W" device_class: power state_class: measurement + availability: "{{ is_number(states('sensor.multiplus_dc_power')) }}" state: >- - {% set v = states('sensor.charger_output_1_voltage')|float(0) %} - {% set a = states('sensor.charger_output_1_current')|float(0) %} - {{ (v * a) | round(1) }} + {{ [states('sensor.multiplus_dc_power') | float(0), 0] | max }} + + - name: MultiPlus Inverter DC Power + unique_id: multiplus_inverter_dc_power + unit_of_measurement: "W" + device_class: power + state_class: measurement + availability: "{{ is_number(states('sensor.multiplus_dc_power')) }}" + state: >- + {{ [0 - states('sensor.multiplus_dc_power') | float(0), 0] | max }} - binary_sensor: - - name: Charger Low Voltage Alarm Active - state: "{{ states('sensor.charger_low_voltage_alarm')|int == 2 }}" - - name: Charger High Voltage Alarm Active - state: "{{ states('sensor.charger_high_voltage_alarm')|int == 2 }}" + - name: MultiPlus AC Input Connected + unique_id: multiplus_ac_input_connected + device_class: power + # Register 29 identifies the selected input; it alone does not establish + # that the Multi is using AC. Keep the entity ID, but report active use. + availability: >- + {{ states('sensor.multiplus_active_input_raw') | int(-1) in [0, 1, 240] + and states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4] + and states('sensor.multiplus_state_raw') | int(-1) + in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 244, 252] }} + state: >- + {{ states('sensor.multiplus_active_input_raw') | int(-1) in [0, 1] + and states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3] + and states('sensor.multiplus_state_raw') | int(-1) + in [3, 4, 5, 6, 7, 8, 10, 11, 244, 252] }} + + - name: MultiPlus High Temperature Alarm + unique_id: multiplus_high_temperature_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_high_temperature_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_high_temperature_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Low Battery Alarm + unique_id: multiplus_low_battery_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_low_battery_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_low_battery_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Overload Alarm + unique_id: multiplus_overload_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_overload_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_overload_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Ripple Alarm + unique_id: multiplus_ripple_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_ripple_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_ripple_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Temperature Sensor Alarm + unique_id: multiplus_temperature_sensor_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_temperature_sensor_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_temperature_sensor_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Voltage Sensor Alarm + unique_id: multiplus_voltage_sensor_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_voltage_sensor_alarm_raw') | int(-1) in [0, 1, 2] }} + state: "{{ states('sensor.multiplus_voltage_sensor_alarm_raw') | int(0) > 0 }}" + + - name: MultiPlus Grid Lost Alarm + unique_id: multiplus_grid_lost_alarm + device_class: problem + availability: >- + {{ states('sensor.multiplus_grid_lost_alarm_raw') | int(-1) in [0, 2] }} + state: "{{ is_state('sensor.multiplus_grid_lost_alarm_raw', '2') }}" + + - name: MultiPlus PowerAssist Enabled + unique_id: multiplus_powerassist_enabled + availability: >- + {{ states('sensor.multiplus_powerassist_enabled_raw') | int(-1) in [0, 1] }} + state: "{{ is_state('sensor.multiplus_powerassist_enabled_raw', '1') }}" + + - name: MultiPlus UPS Enabled + unique_id: multiplus_ups_enabled + availability: >- + {{ states('sensor.multiplus_ups_function_raw') | int(-1) in [0, 1] }} + # Victron register 109 uses 0 for enabled and 1 for disabled. + state: "{{ is_state('sensor.multiplus_ups_function_raw', '0') }}" + + # These controls read their state from the Multi; they never write on startup. + # GX/Digital Multi Control/VE.Bus BMS settings can restrict remote control. + - select: + - name: MultiPlus Mode + unique_id: multiplus_mode + icon: mdi:power-settings + availability: >- + {{ states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4] }} + state: >- + {{ {1:'Charger only',2:'Inverter only',3:'On',4:'Off'} + .get(states('sensor.multiplus_mode_raw') | int(-1), 'Unknown') }} + options: "{{ ['On', 'Charger only', 'Inverter only', 'Off'] }}" + select_option: + - condition: template + value_template: >- + {{ states('sensor.multiplus_mode_raw') | int(-1) in [1, 2, 3, 4] + and option in ['On', 'Charger only', 'Inverter only', 'Off'] }} + - action: modbus.write_register + data: + hub: victron_gx + slave: *multiplus_unit_id + address: 33 + value: "{{ {'Charger only':1,'Inverter only':2,'On':3,'Off':4}[option] }}" + - delay: + seconds: 2 + - action: homeassistant.update_entity + target: + entity_id: + - sensor.multiplus_mode_raw + - sensor.multiplus_state_raw + - sensor.multiplus_active_input_raw + + - number: + - name: MultiPlus AC Input Current Limit + unique_id: multiplus_ac_input_current_limit + icon: mdi:current-ac + device_class: current + unit_of_measurement: "A" + min: 0 + # Van shore-power plug rating; this is a UI bound, not a startup setting. + max: 30 + step: 0.1 + availability: >- + {{ is_number(states('sensor.multiplus_ac_input_current_limit_readback')) + and states('sensor.multiplus_ac_input_current_limit_readback') | float(-1) >= 0 }} + state: "{{ states('sensor.multiplus_ac_input_current_limit_readback') | float(0) }}" + set_value: + - condition: template + value_template: >- + {{ is_number(states('sensor.multiplus_ac_input_current_limit_readback')) + and is_number(value) and 0 <= value | float(-1) <= 30 }} + - action: modbus.write_register + data: + hub: victron_gx + slave: *multiplus_unit_id + address: 22 + # Register 22 is in tenths of an amp: 10.8 A -> 108. + value: "{{ (value | float * 10) | round(0) | int }}" + - delay: + seconds: 2 + - action: homeassistant.update_entity + target: + entity_id: sensor.multiplus_ac_input_current_limit_readback sensor: - platform: integration @@ -496,6 +993,16 @@ sensor: max_sub_interval: minutes: 5 + - platform: integration + source: sensor.multiplus_inverter_dc_power + name: MultiPlus Inverter DC Energy + unique_id: multiplus_inverter_dc_energy + unit_prefix: k + round: 2 + method: trapezoidal + max_sub_interval: + minutes: 5 + utility_meter: dc_load_energy_daily: source: sensor.dc_system_energy @@ -520,3 +1027,11 @@ utility_meter: charger_dc_wattage_monthly: source: sensor.dc_charger_energy cycle: monthly + + multiplus_inverter_dc_energy_daily: + source: sensor.multiplus_inverter_dc_energy + cycle: daily + + multiplus_inverter_dc_energy_monthly: + source: sensor.multiplus_inverter_dc_energy + cycle: monthly