Utility_meter wrong calculation

Starting in 0.115 this should now update when any sensor updates because it will be monitoring states.sensor. When you update to 0.115, you can safely remove entity_id: sensor.time.

Until then, try this:

- platform: template
  sensors:
    light_total_energy:
      friendly_name: Light Total Energy
      entity_id: sensor.time
      unit_of_measurement: kWh
      icon_template: mdi:counter
      value_template: >
        {% set ns = namespace(states=[], offline=[]) %}
        {% for s in states.sensor %}
          {% if s.object_id.endswith('_dimmer_energy') %}
            {% if s.state in ['unavailable', 'unknown' ] %}
              {% set ns.offline = ns.offline + [ s.entity_id ] %}
            {% else %}
              {% set ns.states = ns.states + [ s.state | float ] %}
            {% endif %}
          {% endif %}
        {% endfor %}
        {% if ns.offline | count > 0 %}
          unavailable
        {% else %}
          {{ ns.states | sum | round(2) }}
        {% endif %}

If that gives you problems, i.e. you still get goofy numbers, use the availability template

- platform: template
  sensors:
    light_total_energy:
      friendly_name: Light Total Energy
      entity_id: sensor.time
      unit_of_measurement: kWh
      icon_template: mdi:counter
      value_template: >
        {% set ns = namespace(states=[]) %}
        {% for s in states.sensor %}
          {% if s.object_id.endswith('_dimmer_energy') %}
            {% set ns.states = ns.states + [ s.state | float ] %}
          {% endif %}
        {% endfor %}
        {{ ns.states | sum | round(2) }}
      availability_template: >
        {% set ns = namespace(offline=0) %}
        {% for s in states.sensor %}
          {% if s.object_id.endswith('_dimmer_energy') and s.state in ['unavailable', 'unknown' ] %}
            {% set ns.offline = ns.offline + 1 %}
          {% endif %}
        {% endfor %}
        {{ ns.offline == 0 }}