HILFE! Script liefert nur fast das richtige Ergebnis

Hallo zusammen,
Ihr seid meine letzte Rettung (wie man so zu sagen pflegt)
Ich komme nicht weiter und bin mit meinem Latein am Ende.

Folgende Aufgabe:
Ich habe ein Script das einen Roborock zum saugen schickt. Ich benutze die Roborock Integration von HA.
Im Detail sollen nur die Räume über “app_segment_clean” gesäubert werden deren Input_boolean auf ON steht.

Hier ist was ich bis jetzt habe was FAST die Lösung ist:

alias: Reinigung Starten
sequence:
  - data:
      command: app_segment_clean
      params:
        segments: >
          {% set ids = namespace(list=[]) %} {% for room in
          state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean,
          'on') %}
            {% if loop.first %}
              [{{ room.id }}
            {% else %}
              , {{ room.id }}
            {% endif %}
            {% if loop.last %}
              ]
            {% endif %}
          {% endfor %}
        repeat: 1
    target:
      entity_id: vacuum.ferguson
    action: vacuum.send_command
mode: single
icon: mdi:robot-vacuum

Das Ergebnis sieht so aus:

ergebnis

Um der Syntax gerecht zu werden (laut Doku) muss ein "- " vor segments: (siehe rot markiert)

Und genau das bekomme ich nicht hin.

Hier noch ergänzende Infos:

Ich hoffe inständig jemand weiss Rat.
Bin für jeglichen Denkanstoss dankbar.
Auch ein komplett anderen Ansatz ist mehr als willkommen.

Danke schonmal.

VG
Supergrobi

ggf. so?

alias: Reinigung Starten
sequence:
  - data:
      command: app_segment_clean
      params: >
        - segments: 
          {% set ids = namespace(list=[]) %} {% for room in
          state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean,
          'on') %}
            {% if loop.first %}
              [{{ room.id }}
            {% else %}
              , {{ room.id }}
            {% endif %}
            {% if loop.last %}
              ]
            {% endif %}
          {% endfor %}
      repeat: 1
    target:
      entity_id: vacuum.ferguson
    action: vacuum.send_command
mode: single
icon: mdi:robot-vacuum

Nein leider nicht. Das hatte ich schon probiert. Dann steht nach params: noch zusätzlich |- drin. Aber danke.

Hmm wenn ich so nachdenke. Ggf. könnte ich das - segments einfach in einen sensor schreiben und den einfach ausgeben. Nicht schön. Könnte aber funken. Das probier ich gleich mal.

:crayon:by HarryP: Zusammenführung Doppelpost (bitte “bearbeiten” Funktion nutzen)

versuche es es mal so: Die Anpassung sollte das zusätzliche |- nach params: ausschließen, da die params in einem einzelnen String ausgegeben werden:

alias: Reinigung Starten
sequence:
  - service: vacuum.send_command
    data:
      command: app_segment_clean
      params: >
        - segments: {{ '[' }}
          {% set ids = namespace(list=[]) %}
          {% for room in state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean, 'on') %}
            {% if loop.first %}
              {{ room.id }}
            {% else %}
              , {{ room.id }}
            {% endif %}
          {% endfor %}
        {{ ']' }}
      repeat: 1
    target:
      entity_id: vacuum.ferguson
    action: vacuum.send_command
mode: single
icon: mdi:robot-vacuum

Das werde ich morgen mal vertesten. DANKE!
Leider nein (konnte nicht warten).
Das |- bleibt. Ebenso werden die Räume nun als String und nicht als Liste eingebettet.
sieht so aus nachdem ich {% mit {%- ersetzt hatte.
params: |-
- segments: [ [16, 17
]]
repeat: 1

Versuche doch mal diese ChatGPT Verbesserungen:

alias: Reinigung Starten
sequence:
  - action: vacuum.send_command
    data:
      command: app_segment_clean
      params:
        segments: >
          {% set ids = namespace(list=[]) %}
          {% for room in state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean, 'on') %}
            {% set ids.list = ids.list + [room.id] %}
          {% endfor %}
          {{ ids.list }}
        repeat: 1
    target:
      entity_id: vacuum.ferguson
mode: single
icon: mdi:robot-vacuum

:grin: Hatte mit ChatGPT auch schon Kontakt. Er konnte mir leider auch nicht helfen. Das Code Snippet sieht verdächtig danach aus als ob ich das auch schon ausprobiert hätte. Trotzdem danke für deine Hilfe.

      params: >
        - segments: [{% for room in state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean, 'on') %}{{ room.id }}{% if not loop.last %}, {% endif %}{% endfor %}]

Ist immer noch ein String:

    command: app_segment_clean
    params: '- segments: [16, 17]'

Ohne Liste kommt man hier nicht weiter. Für heute genug. :-).
Fange gerade an mein Problem zu hassen :wink:

dann machen wir eben selbst ein Liste draus:

      params: >
        - segments:
          {% for room in state_attr('sensor.roborock_raume', 'rooms') if is_state(room.boolean, 'on') %}
            {% if not loop.first %} 
            - 
            {% endif %}
            {{ room.id }}
          {% endfor %}

Warum möchtest du denn unbedingt das ‘-’ vor dem ‘segments:’ haben?
Für mich sieht die Ausgabe nach Ausführung des Skripts ok aus.

Laut Doku muss das so. Und das funkt auch wenn ich das händisch mache.
Beispiel aus der Doku.

action: vacuum.send_command
data:
  command: app_segment_clean
  params:
    - segments:
        - 22
        - 23
      repeat: 2
target:
  entity_id: vacuum.s7_roborock

Das weiter oben führt wieder zu |-

params: |-
      - segments:

:pencil2: by tarag: Beiträge zusammengeführt. Bitte bearbeiten Funktion nutzen.
Sorry vergessen :slight_smile:

Die denke das mein krummer Ansatz mit einem Sensor ggf. zum Erfolg führen könnte.

Update: Nein geht auch nicht. Das - ist der Knackpunkt. :thinking:

Update: Nachdem ich nun schon seid geraumer Zeit dabei bin eine Lösung zu finden, hake ich das Thema ab und setze es anders um.
Falls doch jemand die Lösung wissen sollte. Gerne posten. Ich baue es dann bei mir wieder um. Versprochen :slight_smile:

Möglichkeiten:
4 Räume müssen abgedeckt werden. Decke ich alle Möglichkeiten ab komme ich auf 15. 16 wären es wenn kein Raum gereinigt werden soll.
Ergo: 15 scripte und ggf. eine automation die entsprechend der Auswahl das script startet ODER ich gebe hart 4 Möglichkeiten vor (muss meine Family mit leben :wink: )

Gerade drüber nachgedacht. Das passt auch in ein Script. Ist halt etwas länger und tipperei. :sweat_smile:

An dieser Stelle nochmals Danke für das bisherige. :metal:

Meine Finallösung habe ich nun in nur einer Automation untergebracht.

Sicher gehts besser aber vielleicht findet sich das später einmal. Hauptsache, es funktioniert erstmal.