1038 lines
32 KiB
YAML
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
|