DESS Reactive Strategy Homeassistant Template

Hi folks,

here is a little Easter present for Homeassistant users: a template that maps DESS reactive strategy (from current BETA Venus OS!!) to it’s meaning as defined in systemcalc/dynamicess.py

All you need to do is to adjust “unique_id” and the source state (sensor.mp2_dess_reactive_strategy in my case) to your liking…

- sensor:
  - name: "DESS Strategy"
    unique_id: "mp2_dess_reactive_strategy_txt"
    state: >
      {% set mapper = {
        '1': 'SCHEDULED_SELFCONSUME',
        '2': 'SCHEDULED_CHARGE_ALLOW_GRID',
        '3': 'SCHEDULED_CHARGE_ENHANCED',
        '4': 'SELFCONSUME_ACCEPT_CHARGE',
        '5': 'IDLE_SCHEDULED_FEEDIN',
        '6': 'SCHEDULED_DISCHARGE',
        '7': 'SELFCONSUME_ACCEPT_DISCHARGE',
        '8': 'IDLE_MAINTAIN_SURPLUS',
        '9': 'IDLE_MAINTAIN_TARGETSOC',
        '10': 'SCHEDULED_CHARGE_SMOOTH_TRANSITION',
        '11': 'SCHEDULED_CHARGE_FEEDIN',
        '12': 'SCHEDULED_CHARGE_NO_GRID',
        '13': 'SCHEDULED_MINIMUM_DISCHARGE',
        '14': 'SELFCONSUME_NO_GRID',
        '15': 'IDLE_NO_OPPORTUNITY',
        '16': 'UNSCHEDULED_CHARGE_CATCHUP_TARGETSOC',
        '17': 'SELFCONSUME_INCREASED_DISCHARGE',
        '18': 'KEEP_BATTERY_CHARGED',
        '19': 'SCHEDULED_DISCHARGE_SMOOTH_TRANSITION',
        '92': 'DESS_DISABLED',
        '93': 'SELFCONSUME_UNEXPECTED_EXCEPTION',
        '94': 'SELFCONSUME_FAULTY_CHARGERATE',
        '95': 'UNKNOWN_OPERATING_MODE',
        '96': 'ESS_LOW_SOC',
        '97': 'SELFCONSUME_UNMAPPED_STATE',
        '98': 'SELFCONSUME_UNPREDICTED',
        '99': 'NO_WINDOW'} %}
      {% set state =  states('sensor.mp2_dess_reactive_strategy') %}
      {{ mapper[state] if state in mapper else 'Unknown' }}

The MQTT sensor looks like this:

- sensors:
  - unique_id: mp2_dess_reactive_strategy
    name: "DESS Strategy num"
    state_topic: "venus/N/SECRET_SERIAL/system/0/DynamicEss/ReactiveStrategy"
    value_template: "{{ value_json.value }}"
    device:
       name: "mp2"
       identifiers: "mp2"

(SECRET_SERIAL needs to be replaced with your actual value)

3 Likes

Awesome! Funny as well. Just last week I made my own version, which looks almost identical to yours. Here are both strategy + reactivestrategy.

mqtt:
    sensor:
      # DESS strategy
      - name: "DESS Strategy"
        unique_id: "DESS_strategy"
        device_class: enum
        state_topic: "victron/N/SERIAL/system/0/DynamicEss/Strategy"
        value_template: >
          {% set mapper =  {
              0 : 'TARGETSOC',
              1 : 'SELFCONSUME',
              2 : 'PROBATTERY',
              3 : 'PROGRID'} %}
              
          {{ mapper.get(value_json.value,  'Unknown') }}

      # DESS reactive strategy
      - name: "DESS Reactive Strategy"
        unique_id: "DESS_reactive_strategy"
        device_class: enum
        state_topic: "victron/N/SERIAL/system/0/DynamicEss/ReactiveStrategy"
        value_template: >
          {% set mapper =  {
              1 : 'SCHEDULED_SELFCONSUME',
              2 : 'SCHEDULED_CHARGE_ALLOW_GRID',
              3 : 'SCHEDULED_CHARGE_ENHANCED',
              4 : 'SELFCONSUME_ACCEPT_CHARGE',
              5 : 'IDLE_SCHEDULED_FEEDIN', 
              6 : 'SCHEDULED_DISCHARGE',
              7 : 'SELFCONSUME_ACCEPT_DISCHARGE',
              8 : 'IDLE_MAINTAIN_SURPLUS',
              9 : 'IDLE_MAINTAIN_TARGETSOC',
              10 : 'SCHEDULED_CHARGE_SMOOTH_TRANSITION',
              11 : 'SCHEDULED_CHARGE_FEEDIN',
              12 : 'SCHEDULED_CHARGE_NO_GRID',
              13 : 'SCHEDULED_MINIMUM_DISCHARGE',
              14 : 'SELFCONSUME_NO_GRID',
              15 : 'IDLE_NO_OPPORTUNITY',
              16 : 'UNSCHEDULED_CHARGE_CATCHUP_TARGETSOC',
              17 : 'SELFCONSUME_INCREASED_DISCHARGE',
              18 : 'KEEP_BATTERY_CHARGED',
              19 : 'SCHEDULED_DISCHARGE_SMOOTH_TRANSITION',
              92 : 'DESS_DISABLED',
              93 : 'SELFCONSUME_UNEXPECTED_EXCEPTION',
              94 : 'SELFCONSUME_FAULTY_CHARGERATE',
              95 : 'UNKNOWN_OPERATING_MODE',
              96 : 'ESS_LOW_SOC',
              97 : 'SELFCONSUME_UNMAPPED_STATE',
              98 : 'SELFCONSUME_UNPREDICTED',
              99 : 'NO_WINDOW'} %}
              
          {{ mapper.get(value_json.value,  'Unknown') }}

Works very well!

You do not happen to know how to setup the MQTT bridge to the Cerbo if it is running the secure profile ? Username and password via plain text is easy, but I was never able to get ssl to work </different topic>

Unfortunately no, I haven’t tried that. I am using the username & pw method.