Problem with automation, 2x choose with default-block

Hello,

I have a problem with this automation:

- id: 'fronius_energy_forecast'
  alias: "Fronius: Energieprognose abrufen"
  description: Aktualisiert die Energieprognose mit Fehlerbehandlung und Datenvalidierung
  trigger:
    - platform: event
      event_type: fronius_energy_forecast_request
  action:
    - service: rest_command.fronius_get_energy_forecast
      data:
        jwt_token: "{{ state_attr('sensor.fronius_jwt_token', 'jwt_token') }}"
        accesskeyid: "{{ states('input_text.fronius_accesskeyid') }}"
        accesskeyvalue: "{{ states('input_text.fronius_accesskeyvalue') }}"
        pvsystemid: "{{ states('input_text.fronius_pvsystemid') }}"
        fromTime: >-
          {% set t = states('input_text.fronius_fromtime') | replace(' ', '') %}
          {% set now_utc = now().astimezone(tz=None) %}
          {{ now_utc.strftime('%Y-%m-%dT') }}{{ t[:2] }}:{{ t[2:4] }}:{{ t[4:6] }}Z
        toTime: >-
          {% set t = states('input_text.fronius_totime') | replace(' ', '') %}
          {% set now_utc = now().astimezone(tz=None) %}
          {{ now_utc.strftime('%Y-%m-%dT') }}{{ t[:2] }}:{{ t[2:4] }}:{{ t[4:6] }}Z
        continue_on_error: true
        response_variable: forecast_response
    - service: system_log.write
      data:
        message: "API-Rohdaten: {{ forecast_response.content|default({})|to_json }}"
        level: debug
    - choose:
        - conditions: "{{ forecast_response is defined }}"
          sequence:
            - choose:
                # Erfolgsfall (200 OK)
                - conditions: "{{ forecast_response.status == 200 }}"
                  sequence:
                    - service: input_number.set_value
                      target:
                        entity_id: input_number.fronius_energy_forecast
                      data:
                        value: >-
                          {% if forecast_response.content is defined and
                                forecast_response.content.data is defined and
                                forecast_response.content.data|length > 0 %}
                            {% set values = [] %}
                            {% for item in forecast_response.content.data %}
                              {% if item.channels is defined %}
                                {% if item.channels is mapping and item.channels.value is defined %}
                                  {% set values = values + [item.channels.value|float] %}
                                {% elif item.channels|length > 0 and item.channels[0].value is defined %}
                                  {% set values = values + [item.channels[0].value|float] %}
                                {% endif %}
                              {% endif %}
                            {% endfor %}
                            {{ (values|sum / 1000)|round(2) if values|length > 0 else 0.0 }}
                          {% else %}
                            0.0
                          {% endif %}
                    - service: system_log.write
                      data:
                        message: "Prognose erfolgreich aktualisiert: {{ now() }}"
                        level: info

                # Token abgelaufen oder ungĂźltig
                - conditions: >-
                    {{
                      forecast_response.status == 401 or
                      forecast_response.status >= 500 or
                      (forecast_response.content is defined and
                       forecast_response.content is not none and
                       (
                         'JWT expired.' in (forecast_response.content|string) or
                         (
                           'token' in (forecast_response.content|string|lower) and
                           'expired' in (forecast_response.content|string|lower)
                         )
                       )
                      )
                    }}
                  sequence:
                    - service: system_log.write
                      data:
                        message: "Forecast-Request fehlgeschlagen: Authentifizierung/Token-Problem - {{ now() }}"
                        level: warning
                    - delay: "00:01:00"
                    - event: fronius_jwt_request

                # Default für inneren choose (API-Status ≠ 200/401)
                  default:
                  - service: system_log.write
                    data:
                      message: >-
                        Unerwarteter API-Status: {{ forecast_response.status }},
                        Inhalt: {{ forecast_response.content|to_json }}
                      level: error
                  - event: fronius_jwt_request

        # ✅ Korrekt positionierter Default für äußeren choose (forecast_response undefined)
          default:
          - service: system_log.write
            data:
              message: "Keine Antwort vom Forecast-Endpoint erhalten: {{ now() }}"
              level: error
          - event: fronius_jwt_request

A yaml-check says no error. But when loading yaml, HA says this:

Fehler: extra keys not allowed @ data['actions'][2]['choose'][0]['default']. Got [{'service': 'system_log.write', 'data': {'message': 'Keine Antwort vom Forecast-Endpoint erhalten: {{ now() }}', 'level': 'error'}}, {'event': 'fronius_jwt_request'}] extra keys not allowed @ data['actions'][2]['choose'][0]['sequence'][0]['choose'][1]['default']. Got [{'service': 'system_log.write', 'data': {'message': 'Unerwarteter API-Status: {{ forecast_response.status }}, Inhalt: {{ forecast_response.content|to_json }}', 'level': 'error'}}, {'event': 'fronius_jwt_request'}]

I dont understand this

You have a syntax problem. The default is not lining up with the first conditions choose statement.
Move it over to the column where the ‘-’ is.

a shortend version:

- id: 'fronius_energy_forecast'
  action:
    - choose:
        - conditions: "{{ forecast_response is defined }}"
          sequence:
            - choose:
                # Erfolgsfall (200 OK)
                - conditions: "{{ forecast_response.status == 200 }}"
                  sequence:
                    - service: input_number.set_value

                # Token abgelaufen oder ungĂźltig
                - conditions: >-

                # Default für inneren choose (API-Status ≠ 200/401)
                default:
                  - event: fronius_jwt_request

        # ✅ Korrekt positionierter Default für äußeren choose (forecast_response undefined)
        default:
          - service: system_log.write
          - event: fronius_jwt_request

now, the ‘d’ of “default” is in dem same column of the ‘-’ of “- conditions”, but the syntax-checker says this:

bad indentation of a mapping entry (285:17)

 282 |                     - event: fronius_jwt_request
 283 | 
 284 |                 # Default fĂźr inneren choose (A ...
 285 |                 default:
-----------------------^
 286 |                   - service: system_log.write
 287 |                     data:

The d in default must align with the c in choose.

Refer to the examples in the documentation.

@123 You’re right. And I checked one of mine before saying that, but I saw it cross-eyed I guess.

There are 2 defaults to move in that. @blacksun

that was the solution.

@Sir_Goodenough @123
thanks for your fast help

1 Like