Formel in config.yaml funktioniert nicht

Folgende Formel zur Berechnung eines dynamischen Faktors habe ich aufgestellt. Laut Prüftool keine syntaktischen Fehler. Ohne den „else Zweig“ funktionierte sie auch schon einmal. Mittlerweile kann ich nicht einmal mehr zur alten config.yaml zurück - die Entität, die den Wert dieser Berechnung annehmen soll, wird nicht mehr angelegt. Woran könnte das liegen? Habe bereits mehrfach HA neugestartet, Yamls alle neu gestartet usw. Hat nix gebracht.


- sensor:
    # Victron Power Soll 2
      - name: Victron Power Soll 2
        unique_id: "Victron_Power_Soll_2"
        unit_of_measurement: 'W'
        state: >-
          {% if (float(states("sensor.haus_pv_uberschuss_defizit“))) > 0 -%}
          {{ (float(states("sensor.haus_pv_uberschuss_defizit“)))*1000*
          (0.5+(((float(states("sensor.sbs6_0_10_738_battery_soc_total")))-
          (float(states("sensor.victron_system_battery_soc_2"))))/200)) }}
          {%- else -%}
          {{ (float(states("sensor.haus_pv_uberschuss_defizit“)))*1000*
          (0.5+
          (((float(states("sensor.victron_system_battery_soc_2“)))-
          (float(states("sensor.sbs6_0_10_738_battery_soc_total“))))/200)) }}.
          {%- endif %}

was kommt den für eine Fehlermeldung im Log/Protokoll?

Einstellungen → System → Protokolle

File 'configuration.yaml' could not be parsed, it was referenced from path 'configuration.yaml'.This file will be ignored. Error(s): - YAMLSemanticError: Implicit map keys need to be followed by map values

Was sind denn implicit map keys?

Ich bin jetzt schon die ganze Zeit am Kommas versetzen, Anzahl der Kommas verringern…

Die Formel lautet eigentlich so:

Victron_Power_Soll_2 = Saldo_Verbrauch_Ertrag*1000*(0.5 + ((Soc1-Soc2)/200))

Der Witz an der Sache: Es hat schon mal so funktioniert. Dann hatte ich Zweifel, ob das sowohl für Nettoüberschuss (negative Werte) und Nettoverbrauch richtig wäre, und habe mit dem if — endif zwei Varianten gebildet. Ab da gings nicht mehr, was auch immer ich probierte.

Ich habe das dysfunktionale Template gelöscht, neu geparst (HA neu gestartet), dann den originalen Code wieder eingefügt. Die Fehlermeldung oben war das Resultat.

Schau dir mal deine schließenden Double-Quotes genau an :wink:

1 „Gefällt mir“

Ein Template überprüfst Du am einfachsten im Template Editor.
Entwicklungswerkzeuge - Template

Du hast die falschen Hochkomma verwendet.
nicht
"
sondern
'
verwenden.

{% if (states('sensor.haus_pv_uberschuss_defizit') | float(0)) > 0 -%}
  {{ (states('sensor.haus_pv_uberschuss_defizit') | float(0))*1000*
  (0.5+(((states('sensor.sbs6_0_10_738_battery_soc_total') | float(0) )-
  (states('sensor.victron_system_battery_soc_2') / float(0)))/200)) }}
{%- else -%}
  {{ (states('sensor.haus_pv_uberschuss_defizit') | float(0))*1000*
  (0.5+
  (((states('sensor.victron_system_battery_soc_2') | float(0))-
  (states('sensor.sbs6_0_10_738_battery_soc_total') | float(0)))/200)) }}
{%- endif %}

Gruß
Osorkon

1 „Gefällt mir“

Der Punkt am Ende ist zu viel. Ich kann dir als Editor Visual Studio Code als Addon empfehlen, das zeigt dir die Fehler gleich an

Er kann schon die doppelten Hochkommata verwenden, nur müssen es die gleichen sein!

1 „Gefällt mir“

Der stört weniger. :wink:
Damit hängst Du nur einen zusätzlichen Punkt ans ende an.

Gruß
Osorkon

1 „Gefällt mir“

Danke! Keine Ahnung wie die da reingekommen sind. Liegt wahrscheinlich an unterschiedlichen Tastaturzeichensätzen - habe ein paar Zeilen im normalen Texteditor eingetippt. Ist wirklich schwer zu erkennen!

Den habe ich ja - aber wenn man trotzdem Texte woanders tippt, und dann Copy&Paste macht, dann passiert sowas eben.

1 „Gefällt mir“

Btw: Einen Template Sensor kannst Du auch direkt in der GUI erstellen, ohne yaml gefummel.

Einstellungen → Geräte & Dienste → Helfer → + HELFER ERSTELLEN → Template → Template für einen Sensor.

Da bekommst Du auch gleich bei der Eingabe des Templates auch das Ergebis präsentiert.

Gruß
Osorkon

1 „Gefällt mir“

Bin zwar nicht @Osorkon , aber gern geschehen :wink:

Daran habe ich mich noch nicht getraut! Aber das ist natürlich auch eine tolle Methode! Werd’s mir für weitere solche Sachen merken! :+1:

Ich habe das mal jetzt als Helfer - Template eingegeben, allerdings mit noch einer weiteren Bedingung nach dem Motto “if - then if else” … und schon bin ich wieder lost :roll_eyes:.

Das Ergebnis wird unten drunter zwar angezeigt, also irgendeine Berechnung findet tatsächlich statt. Und scheint auch zu stimmen. Doch über dem ganzen steht “invalid flow” - was ich auf die Syntax zurückführe, also if - elif - else - endif

Was ist da falsch?

{% if float(states("sensor.vic_bat_pwr_raw")) > float(states("number.victron_ladelimit")) -%}

          {{ float(states("number.victron_ladelimit")) 
          }}
          {%- elif float(states("sensor.vic_bat_pwr_raw")) < float(states("number.victron_entladelimit"))-%}
          
          {{ float(states("number.victron_entladelimit")) 
          }}
          {%- else -%}
           {{float(states("sensor.vic_bat_pwr_raw"))
            }}
          {%- endif -%}

Danke fürs korrigieren im Voraus! (Wo finde ich eine Doku mit nutzbaren Beispiel-Flows darüber? Meine Suche blieb leider ergebnislos, vielleicht auch, weil ich nicht weiß wonach ich suchen soll....

Zur Erklärung: Eine Entität soll zweiseitig auf Grenzwerte überprüft werden, und mit diesen gleichgesetzt werden, wenn sie über- bzw. unterschritten werden. (der zweite GW ist negativ)

Im Template-Editor kommt: TemplateSyntaxInvalid: Unexpected ‘%’

Welches ‘%’ ist denn da verkehrt?

Der Code wie du ihn gepostet hast, bringt bei mir im Templateeditor keinen Fehler!
Du solltest aber möglichst bei deinen float-Statements einen Default mit angeben. Dieser wird genutzt, falls die entsprechende Entität mal nicht verfügbar ist.
(SyntaxInvalid: Unexpected ‘%’ wird häufig angezeigt, wenn davor eine Klammer vergessen wurde.)

Das lässt mich natürlich ratlos zurück. Der hier gepostete Code ist 1:1 der den ich im Helfer-Template und im Template Editor eingetippt habe.

Aber wie funktioniert die “Default” - Angabe? Nochmals ein weiteres “elif” ?

sollte mit “Default” so ausschauen:

{{ states("sensor.vic_bat_pwr_raw") | float(default=0) }}
1 „Gefällt mir“

Es kann auch so benutzt werden {{ float(states("sensor.vic_bat_pwr_raw"), default=0) }}.
Wobei es scheinbar auch ohne die explizite Angabe von default= funktioniert.

Komisch - nachdem ich genau deinen Default - Text eingebaut hatte funktionierte es plötzlich!

Ich weiß zwar nicht warum aber ich bin glücklich ! :blush:

Klar so geht es auch. Ich bevorzuge halt die andere Schreibweise weil es für mich besser ersichtlich ist da es so wie geschrieben auch in “zeitlicher Folge” ausgeführt wird. Ist in meinen Augen etwas übersichtlicher als die “verschachtelte” Schreibweise. Jeder wie er’s mag!

1 „Gefällt mir“