Files
dotfiles/systems/brain/services/home_assistant/victron_modbuss.yaml
T
2026-10-24 20:30:13 -04:00

1038 lines
32 KiB
YAML

modbus:
- name: victron_gx
type: tcp
host: 192.168.103.30
port: 502
timeout: 3
delay: 2
lazy_error_count: 10
sensors:
# ---- SOLAR CHARGER (Unit ID 226) ----
- name: Solar Voltage
slave: 226
address: 776
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
- name: Solar Amperage
slave: 226
address: 777
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
- name: Solar Wattage
slave: 226
address: 789
input_type: holding
data_type: uint16
scale: 0.1
unit_of_measurement: "W"
device_class: power
state_class: measurement
- name: Solar Yield Today
slave: 226
address: 784
input_type: holding
data_type: uint16
scale: 0.1
precision: 3
unit_of_measurement: "kWh"
device_class: energy
state_class: total
# DC system
- name: DC Voltage
slave: 100
address: 840
input_type: holding
data_type: uint16
scale: 0.1
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
unique_id: dc_voltage
- name: DC Wattage
slave: 100
address: 860
input_type: holding
data_type: int16
scale: 1
precision: 0
unit_of_measurement: "W"
device_class: power
state_class: measurement
unique_id: dc_wattage
# GPS (Slave ID 100)
- name: GPS Latitude ID 100
slave: 100
address: 2800
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_latitude_id_100
- name: GPS Longitude ID 100
slave: 100
address: 2802
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_longitude_id_100
- name: GPS Course ID 100
slave: 100
address: 2804
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "°"
state_class: measurement
unique_id: gps_course_id_100
- name: GPS Speed ID 100
slave: 100
address: 2805
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "m/s"
state_class: measurement
unique_id: gps_speed_id_100
- name: GPS Fix ID 100
slave: 100
address: 2806
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_fix_id_100
- name: GPS Satellites ID 100
slave: 100
address: 2807
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_satellites_id_100
- name: GPS Altitude ID 100
slave: 100
address: 2808
input_type: holding
data_type: int32
scale: 0.16
precision: 1
unit_of_measurement: "m"
state_class: measurement
unique_id: gps_altitude_id_100
# GPS (Unit ID 1)
- name: GPS Latitude ID 1
slave: 1
address: 2800
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_latitude_id_1
- name: GPS Longitude ID 1
slave: 1
address: 2802
input_type: holding
data_type: int32
scale: 0.0000001
precision: 7
state_class: measurement
unique_id: gps_longitude_id_1
- name: GPS Course ID 1
slave: 1
address: 2804
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "°"
state_class: measurement
unique_id: gps_course_id_1
- name: GPS Speed ID 1
slave: 1
address: 2805
input_type: holding
data_type: uint16
scale: 0.01
precision: 2
unit_of_measurement: "m/s"
state_class: measurement
unique_id: gps_speed_id_1
- name: GPS Fix ID 1
slave: 1
address: 2806
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_fix_id_1
- name: GPS Satellites ID 1
slave: 1
address: 2807
input_type: holding
data_type: uint16
scale: 1
state_class: measurement
unique_id: gps_satellites_id_1
- name: GPS Altitude ID 1
slave: 1
address: 2808
input_type: holding
data_type: int32
scale: 0.16
precision: 1
unit_of_measurement: "m"
state_class: measurement
unique_id: gps_altitude_id_1
# ---- 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
precision: 2
unit_of_measurement: "V"
device_class: voltage
state_class: measurement
scan_interval: 10
- name: MultiPlus Battery Current
unique_id: multiplus_battery_current
slave: *multiplus_unit_id
address: 27
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 Battery Temperature
unique_id: multiplus_battery_temperature
slave: *multiplus_unit_id
address: 61
input_type: holding
data_type: int16
scale: 0.1
precision: 1
unit_of_measurement: "°C"
device_class: temperature
state_class: measurement
- 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
precision: 1
unit_of_measurement: "A"
device_class: current
state_class: measurement
scan_interval: 10
- name: MultiPlus Mode Raw
unique_id: multiplus_mode_raw
slave: *multiplus_unit_id
address: 33
input_type: holding
data_type: uint16
scan_interval: 10
- name: MultiPlus State Raw
unique_id: multiplus_state_raw
slave: *multiplus_unit_id
address: 31
input_type: holding
data_type: uint16
scan_interval: 10
- name: MultiPlus Charge State Raw
unique_id: multiplus_charge_state_raw
slave: *multiplus_unit_id
address: 95
input_type: holding
data_type: uint16
scan_interval: 10
- name: MultiPlus Active Input Raw
unique_id: multiplus_active_input_raw
slave: *multiplus_unit_id
address: 29
input_type: holding
data_type: uint16
scan_interval: 10
- name: MultiPlus Phase Count
unique_id: multiplus_phase_count
slave: *multiplus_unit_id
address: 28
input_type: holding
data_type: uint16
- 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
template:
- sensor:
# GPS aggregation: prefer slave 100, fall back to slave 1
- name: GPS Latitude
unique_id: gps_latitude
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_latitude_id_100') %}
{% set v1 = states('sensor.gps_latitude_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] and v100 | float(0) != 0 %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] and v1 | float(0) != 0 %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Longitude
unique_id: gps_longitude
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_longitude_id_100') %}
{% set v1 = states('sensor.gps_longitude_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] and v100 | float(0) != 0 %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] and v1 | float(0) != 0 %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Course
unique_id: gps_course
unit_of_measurement: "°"
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_course_id_100') %}
{% set v1 = states('sensor.gps_course_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Speed
unique_id: gps_speed
unit_of_measurement: "m/s"
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_speed_id_100') %}
{% set v1 = states('sensor.gps_speed_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Fix
unique_id: gps_fix
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_fix_id_100') %}
{% set v1 = states('sensor.gps_fix_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] and v100 | int(0) > 0 %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] and v1 | int(0) > 0 %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Satellites
unique_id: gps_satellites
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_satellites_id_100') %}
{% set v1 = states('sensor.gps_satellites_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] and v100 | int(0) > 0 %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] and v1 | int(0) > 0 %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: GPS Altitude
unique_id: gps_altitude
unit_of_measurement: "m"
state_class: measurement
state: >-
{% set v100 = states('sensor.gps_altitude_id_100') %}
{% set v1 = states('sensor.gps_altitude_id_1') %}
{% if v100 not in ['unavailable', 'unknown'] %}
{{ v100 }}
{% elif v1 not in ['unavailable', 'unknown'] %}
{{ v1 }}
{% else %}
{{ v100 }}
{% endif %}
- name: MultiPlus State
unique_id: multiplus_state
availability: "{{ is_number(states('sensor.multiplus_state_raw')) }}"
state: >-
{% 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',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: >-
{{ [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: 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
source: sensor.dc_wattage
name: DC System Energy
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.solar_wattage
name: Solar Yield
unit_prefix: k
round: 2
method: trapezoidal
max_sub_interval:
minutes: 5
- platform: integration
source: sensor.charger_dc_wattage
name: DC Charger Energy
unit_prefix: k
round: 2
method: trapezoidal
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
cycle: daily
dc_load_energy_monthly:
source: sensor.dc_system_energy
cycle: monthly
solar_yield_daily:
source: sensor.solar_yield
cycle: daily
solar_yield_monthly:
source: sensor.solar_yield
cycle: monthly
charger_dc_wattage_daily:
source: sensor.dc_charger_energy
cycle: daily
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