Service with empty entity_id

Hi there, this is my first post and I hope it will not be very dumb :slight_smile:

I’ve successfully finished a project for using an water accumulation tank as an energy storage for photo voltaic panels. However I have had bad luck when I was editing my automation with visual studio plugin. I’ve got a connection drop and visual studio for some reason wiped my automation file blank. Now I am trying to write the code again with the same logic (or at least I think it was like that) but I am crashing on “Invalid data for call_service at pos 2: not a valid value for dictionary value @ data[‘entity_id’]” in the log. I am aware that my templates can produce an empty entity_id for the service, that’s because to omit the service action in some cases. I don’t know if this is allowed but also I think it was working like this before.

Here is the code:

- alias: Solar Water Heating Power Injection
# The purpose of the automation is to use the accumulation tank of the house as a battery.
# There are two 3-phase heating elements top/bottom (heating wires) in the 700l accumulatioln tank.
# There is digitally controlled SCR installed in L3 phase.
  trigger:
    platform: state
    entity_id: sensor.solaredge_current_power, sensor.house_current_power
  condition:
    condition: state
    entity_id: binary_sensor.solar_overproduction
    state: 'on'
  action:
  # The first part of action should roughly set the power feed to the water heating elements by setting the power phases
  # Variables ht1 and ht2 are the tresholds for phases. ht1 is equal to the power of the single phase heating element power, ht2 = ht1 * 2 
  # turn off the non-needed phases or do nothing (empty entity_id)
  - service: switch.turn_off
    data_template:
      entity_id: "{% if (states('sensor.solaredge_current_power') | int
        - states('sensor.house_current_power_without_heating') | int)
        < states.variable.ht1.state | int %}
        switch.water_heating_L1, switch.water_heating_L2
        {% elif (states('sensor.solaredge_current_power') | int
        - states('sensor.house_current_power_without_heating') | int)
        < states.variable.ht2.state | int %}
        switch.water_heating_L1
        {% endif %}"
  # turnd on needed phases or do nothing (empty entity_id)
  - service: switch.turn_on
    data_template:
      entity_id: "{% if (states('sensor.solaredge_current_power') | int 
        - states('sensor.house_current_power_without_heating') | int) > states.variable.ht2.state | int %}
        switch.water_heating_L1, switch.water_heating_L2
        {% elif (states('sensor.solaredge_current_power') | int 
        - states('sensor.house_current_power_without_heating') | int) > states.variable.ht1.state | int %}
        switch.water_heating_L1
        {% endif %}"
  # this section regulates SCR attached to L3 phase for fine adjustment of the heating power
  # SCR has range from 0 to 100 steps and two +/- buttons
  # The purpose with this code is to press +/- buttons until the photovoltaic production = house consumption +/- 10W
  # press + or - button, or do nothing if the power is in balance
  - service: switch.turn_on
    data_template:
      entity_id: "{% if (states('sensor.solaredge_current_power') | int - states('sensor.house_current_power') | int) > 10 %}
        switch.Water_Heating_L3_power_step_up
        {% elif (states('sensor.house_current_power') | int - states('sensor.solaredge_current_power') | int ) > 10 %}
        switch.Water_Heating_L3_power_step_down
        {% endif %}"
  # release the button press, no matter which one was pressed
  - service: switch.turn_off
    entity_id: switch.Water_Heating_L3_power_step_up, switch.Water_Heating_L3_power_step_down
  # get the instant re-measurement (this sould also loop the whole automation as it will change sensor.house_current_power state)
  - service: mqtt.publish
    data_template:
      topic: 'cmnd/water_heating_L3/STATUS'
      payload: 10
  id: 53a32e3e3b69477e96e5edc082634dc9

Thanks in advance for your opinions!

It’s not allowed; you cannot call switch.turn_on without specifying an entity_id to turn on.

The cleanest solution is to include a condition that prevents the action from executing for the situation when there’s no entity_id. If there’s nothing to turn on/off then the action shouldn’t be executed in the first place and that where an appropriate condition can help.

The quick and dirty solution is to call an non-existent entity_id like switch.none. It will pass Config Check and no error will be produced when switch.turn_on service is called.

1 Like

Thanks! I will test the dirty solution the next time when there will be solar overproduction.