Templatka sensora - dziwny błąd w konfiguracji

W pliku templates.yaml bezskutecznie próbuję stworzyć templatkę sensora z aktualną taryfą prądu dla cennika Tauron G12W: sensor.tauron_aktualna_taryfa_g12w, który ma wyznaczać i przechowywać tekstową wartość stanu DZIENNA lub NOCNA lub WEEKEND. Atrybuty tego sensora mają przechowywać aktualną cenę prądu (netto i brutto) w zależności od stanu samego sensora.
Sensor ten korzysta z wartości cennikowych przechowywanych w innych sensorach w następujący sposób:

- sensor:
    # Ceny taryfowe sprzedaży energii Tauron Taryfa G12W
    - name: Tauron Dzienna Cena Energii Netto G12W
      unique_id: tauron_dzienna_cena_energii_netto_g12w
      state: "{{ (0.5050) }}"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Nocna Cena Energii Netto G12W
      unique_id: tauron_nocna_cena_energii_netto_g12w
      state: "{{ (0.2476) }}"
      unit_of_measurement: "zł/kWh"
    - name: Stawka VAT na energię
      unique_id: stawka_vat_na_energie
      state: "{{ (0.23) }}"
      unit_of_measurement: "%"
    # Stawki dystrybucyjne TAURON
    - name: Tauron Opłata Dystrybucyjna Zmienna Netto G12W Dzień
      unique_id: tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien
      state: "{{ (0.3657) }}"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Opłata Dystrybucyjna Zmienna Netto G12W Noc
      unique_id: tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc
      state: "{{ (0.0904) }}"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Opłata Dystrybucyjna Stała Netto G12W Miesięcznie
      unique_id: tauron_oplata_dystrybucyjna_stala_netto_g12w_miesiecznie
      state: "{{ (10.67) }}"
      unit_of_measurement: "zł/mies"

Natomiast wspomniany sensor główny sensor.tauron_aktualna_taryfa_g12w ma nastepującą definicję:

- sensor:
  - name: Tauron Aktualna Taryfa G12w
    unique_id: tauron_aktualna_taryfa_g12w
    icon: mdi:meter-electric-outline
    state: >
      {% set cena = {
        "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
        "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
        "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
        "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0),
        "vat": 1 + states('sensor.stawka_vat_na_energie')|float(0)}
      %}
      {% set cn = 0 %}
      {% set cb = 0 %}
      {% set taryfa = 'WEEKEND' %}
      {% set peaks = [(6, 13), (15, 22)] %}
      {% set is_weekend = ((now().weekday() >=5 ) or states('calendar.swieta_w_polsce') == 'on')) %}
        {% if not is_weekend %}
          {% for peak in peaks %}
            {% if ((now().hour >= peak[0]) and (now().hour < peak[1])) %}
              {% set is_peak = True %} 
              {% set taryfa = 'DZIENNA' %}
              {% set cn = (cena.dp + cena.dd)|float(0)|round(4) %}
              {% set cb = (cn * cena.vat)|float(0)|round(4) %}
            {% else %}
              {% set is_peak = False %}
              {% set taryfa = 'NOCNA' %}
              {% set cn = (cena.np + cena.nd)|float(0)|round(4)} %}
              {% set cb = (cn * cena.vat)|float(0)|round(4) %}
            {% endif %}
          {% endfor %}
        {% else %}
          {% set is_peak = False %}
          {% set cn = (cena.np + cena.nd)|float(0)|round(4) %}
          {% set cb = (cn * cena.vat)|float(0)|round(4) %}
        {% endif %}
      {{taryfa}}
    attributes:
      cena_netto_1kWh: "{{(cn)}}"
      cena_brutto_1kWh: "{{(cb)}}"

Powinien on wyznaczać taryfę w zależności od dnia tygodnia i pory dnia.
Tymczasem nic nie wyznacza, tylko narzeka na błąd, którego nie widać:

Rejestrator: homeassistant.config
Źródło: config.py:357
Pierwsze zdarzenie: 10:44:06 (5 wystąpień)
Ostatnio zalogowany: 12:25:13

Invalid config for 'template' at templates.yaml, line 302: invalid template (TemplateSyntaxError: unexpected '}') for dictionary value 'sensor->67->state', got '{% set cena =\n {\n "dp": states(\'sensor.tauron_dzienna_cena_energii_netto_g12w\')|float,\n "dd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien\')|float,\n "np": states(\'sensor.tauron_nocna_cena_energii_netto_g12w\')|float,\n "nd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc\')|float,\n "vat": 1 + states(\'sensor.stawka_vat_na_energie\')|float\n }\n%} {% set peaks = [(6, 13), (15, 22)] %} {% set is_weekend = ((now().weekday() >=5 ) or (s...
Invalid config for 'template' at templates.yaml, line 302: invalid template (TemplateSyntaxError: unexpected '}') for dictionary value 'sensor->67->state', got '{% set cena = {\n "dp": states(\'sensor.tauron_dzienna_cena_energii_netto_g12w\')|float,\n "dd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien\')|float,\n "np": states(\'sensor.tauron_nocna_cena_energii_netto_g12w\')|float,\n "nd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc\')|float,\n "vat": 1 + states(\'sensor.stawka_vat_na_energie\')|float\n} %} {% set peaks = [(6, 13), (15, 22)] %} {% set is_weekend = ((now().weekday() >=5 ) or (states(...
Invalid config for 'template' at templates.yaml, line 302: invalid template (TemplateSyntaxError: unexpected '}') for dictionary value 'sensor->67->state', got '{% set cena = {\n "dp": states(\'sensor.tauron_dzienna_cena_energii_netto_g12w\')|float(0),\n "dd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien\')|float(0),\n "np": states(\'sensor.tauron_nocna_cena_energii_netto_g12w\')|float(0),\n "nd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc\')|float(0),\n "vat": 1 + states(\'sensor.stawka_vat_na_energie\')|float(0)\n} %} {% set peaks = [(6, 13), (15, 22)] %} {% set is_weekend = ((now().weekday() >=...
Invalid config for 'template' at templates.yaml, line 301: invalid template (TemplateSyntaxError: unexpected '}') for dictionary value 'sensor->67->state', got '{% set cena = {\n "dp": states(\'sensor.tauron_dzienna_cena_energii_netto_g12w\')|float(0),\n "dd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien\')|float(0),\n "np": states(\'sensor.tauron_nocna_cena_energii_netto_g12w\')|float(0),\n "nd": states(\'sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc\')|float(0),\n "vat": 1 + states(\'sensor.stawka_vat_na_energie\')|float(0)\n} %} {% set taryfa = \'WEEKEND\' %} {% set peaks = [(6, 13), (15, 22)] %} {% set is...

Linia 302 wskazuje na state: > w powyższej definicji sensora sensor.tauron_aktualna_taryfa_g12w.

Na dodatek żaden z tych sensorów (nawet tych z cennikiem) nie jest osiągalny:

Próbuję walczyć z tym błędem od kilku dni ale wciąż nie rozumiem jego źródła… Może ktoś z Was będzie bardziej spostrzegawczy? Proszę, pomóżcie…

Masz dwa nawiasy zamykające }%}

{% set cn = (cena.np + cena.nd)|float(0)|round(4)} %}

Zmień na:

{% set cn = (cena.np + cena.nd)|float(0)|round(4) %}

Jeszcze jeden) :

is_weekend: >
  {{ now().weekday() in (5,6)) }}

Zmień na:

is_weekend: >
  {{ now().weekday() in (5,6) }}
1 Like

Masz SOKOLE oko! Faktycznie! :beer:
Ciekawe, że mój edytor VSCode nie wykazywał tego błędu, choć ilość nawiasów ewidentnie nie była parzysta…
Poprawienie kodu jednak nadal nie daje wyniku, bo sensor ten wciąż nie przyjmuje żadnej wartości ani swojej ani atrybutów. Zobacz poprawiony kod:

    - name: Tauron Aktualna Taryfa G12w
      unique_id: tauron_aktualna_taryfa_g12w
      icon: mdi:meter-electric-outline
      state: >
        {% set cena = {
          "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
          "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
          "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
          "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0),
          "vat": 1 + states('sensor.stawka_vat_na_energie')|float(0)}
        %}
        {% set cena_netto = 0 %}
        {% set cena_brutto = 0 %}
        {% set peaks = [(6, 13), (15, 22)] %}
        {% set is_weekend = (now().weekday() >=5 or  states('calendar.swieta_w_polsce') == 'on') %}
          {% if not is_weekend %}
            {% for peak in peaks %}
              {% if now().hour >= peak[0] and now().hour < peak[1] %}
                {% set is_peak = True %} 
                {% set taryfa = "DZIENNA" %}
                {% set cena_netto = (cena.dp + cena.dd)|float(0)|round(4) %}
                {% set cena_brutto = (cena_netto * cena.vat)|float(0)|round(4) %}
              {% else %}
                {% set is_peak = False %}
                {% set taryfa = "NOCNA" %}
                {% set cena_netto = (cena.np + cena.nd)|float(0)|round(4) %}
                {% set cena_brutto = (cena_netto * cena.vat)|float(0)|round(4) %}
              {% endif %}
            {% endfor %}
          {% else %}
            {% set is_peak = False %}
            {% set taryfa = "WEEKEND" %}
            {% set cena_netto = (cena.np + cena.nd)|float(0)|round(4) %}
            {% set cena_brutto = (cena_netto * cena.vat)|float(0)|round(4) %}
          {% endif %}
        {{taryfa}}
      attributes:
        cena_netto_1kWh: "{{cena_netto}}"
        cena_brutto_1kWh: "{{cena_brutto}}"

Niby nie ma błedów, ale:


Wyglada na to, że nadrzędny warunek {% if not is_weekend %} w ogóle nie jest sprawdzany…

Rejestrator: unexpected '}')
A nie sokole oko :grinning:

Bez pętli (prawdopodobnie tutaj jest coś nie tak)
Sprawdź

- name: Tauron Aktualna Taryfa G12w
  unique_id: tauron_aktualna_taryfa_g12w
  icon: mdi:meter-electric-outline
  state: >
    {% set cena = {
      "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
      "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
      "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
      "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0),
      "vat": 1 + states('sensor.stawka_vat_na_energie')|float(0)
    } %}
    {% set hour = now().hour %}
    {% set is_weekend = (now().weekday() >= 5 or states('calendar.swieta_w_polsce') == 'on') %}
    
    {% if not is_weekend %}
      {% if (hour >= 6 and hour < 13) or (hour >= 15 and hour < 22) %}
        {% set taryfa = "DZIENNA" %}
        {% set cena_netto = (cena.dp + cena.dd) | round(4) %}
        {% set cena_brutto = (cena_netto * cena.vat) | round(4) %}
      {% else %}
        {% set taryfa = "NOCNA" %}
        {% set cena_netto = (cena.np + cena.nd) | round(4) %}
        {% set cena_brutto = (cena_netto * cena.vat) | round(4) %}
      {% endif %}
    {% else %}
      {% set taryfa = "WEEKEND" %}
      {% set cena_netto = (cena.np + cena.nd) | round(4) %}
      {% set cena_brutto = (cena_netto * cena.vat) | round(4) %}
    {% endif %}
    
    {{ taryfa }}
  attributes:
    cena_netto_1kWh: "{{ cena_netto }}"
    cena_brutto_1kWh: "{{ cena_brutto }}"

Zakładka "Szablony"testuj poszczególne fragmenty np.

{% set is_weekend = (now().weekday() >= 5 or states('calendar.swieta_w_polsce') == 'on') %}
Weekend: {{ is_weekend }}
{% set vat = 1 + states('sensor.stawka_vat_na_energie')|float(0) %}
VAT: {{ vat }}
{% set hour = now().hour %}
{% set is_weekend = (now().weekday() >= 5) %}
{% set is_peak = (hour >= 6 and hour < 13) or (hour >= 15 and hour < 22) %}
Czy szczyt i dzień roboczy: {{ not is_weekend and is_peak }}

Tak tak, dostawałem ten komunikat, ale w samym kodzie nie byłem w stanie znaleźć tego nadmiarowego nawiasu }, dlatego dla mnie jesteś Sokole Oko :wink:

Zamieniłem pętlę {% for peak in peaks %} na warunek {% if (hour >= 6 and hour < 13) or (hour >= 15 and hour < 22) %} i teraz rzeczywiście sensor zaczyna liczyć się poprawnie! Dziękuję za tę cenną podpowiedź :beer:

Natomiast wciąż pozostaje problem z atrybutami. W zakładce “Szablon” liczą się one bezbłędnie do samego końca kodu, ale jeśli w templatce zdefiniuję je tak:

      attributes:
        cena_netto_1kWh: "{{cena_netto}}"
        cena_brutto_1kWh: "{{cena_brutto}}"

to otrzymuję… ich brak:


Wygląda to tak, jakby w obrębie tego samego sensora zmienne w sekcji state: oraz attributes wzajemnie się nie widziały… Czy to możliwe?? Nie byłoby to logiczne, skoro mówimy o jednym i tym samym sensorze…

Odczyt tych atrybutów w zakładce ‘Szablon’ zdaje się to potwierdzać:

Wydaje mi się (pewnoście nie mam) że zmienne zdefiniowane w “state:” sa niedostępne w “attributes:” i chyba trzeba to policzyć na nowo:

- sensor:
    # Ceny taryfowe sprzedaży energii Tauron Taryfa G12W
    - name: Tauron Dzienna Cena Energii Netto G12W
      unique_id: tauron_dzienna_cena_energii_netto_g12w
      state: "0.5050"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Nocna Cena Energii Netto G12W
      unique_id: tauron_nocna_cena_energii_netto_g12w
      state: "0.2476"
      unit_of_measurement: "zł/kWh"
    - name: Stawka VAT na energię
      unique_id: stawka_vat_na_energie
      state: "0.23"
      unit_of_measurement: "%"
    # Stawki dystrybucyjne TAURON
    - name: Tauron Opłata Dystrybucyjna Zmienna Netto G12W Dzień
      unique_id: tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien
      state: "0.3657"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Opłata Dystrybucyjna Zmienna Netto G12W Noc
      unique_id: tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc
      state: "0.0904"
      unit_of_measurement: "zł/kWh"
    - name: Tauron Opłata Dystrybucyjna Stała Netto G12W Miesięcznie
      unique_id: tauron_oplata_dystrybucyjna_stala_netto_g12w_miesiecznie
      state: "10.67"
      unit_of_measurement: "zł/mies"
    - name: "Tauron Aktualna Taryfa G12w"
      unique_id: tauron_aktualna_taryfa_g12w
      icon: mdi:meter-electric-outline
      state: >
        {% set cena = {
          "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
          "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
          "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
          "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0),
          "vat": 1 + states('sensor.stawka_vat_na_energie')|float(0)
        } %}
        {% set hour = now().hour %}
        {% set weekday = now().weekday() %}
        {% set is_weekend = (weekday >= 5 or states('calendar.swieta_w_polsce') == 'on') %}
        {% if is_weekend %}
          {% set taryfa = "WEEKEND" %}
          {% set cena_netto = (cena.np + cena.nd)|round(4) %}
        {% elif (6 <= hour < 13) or (15 <= hour < 22) %}
          {% set taryfa = "DZIENNA" %}
          {% set cena_netto = (cena.dp + cena.dd)|round(4) %}
        {% else %}
          {% set taryfa = "NOCNA" %}
          {% set cena_netto = (cena.np + cena.nd)|round(4) %}
        {% endif %}
        {% set cena_brutto = (cena_netto * cena.vat)|round(4) %}
        {{ taryfa }}
      attributes:
        cena_netto_1kWh: >
          {% set hour = now().hour %}
          {% set weekday = now().weekday() %}
          {% set is_weekend = (weekday >= 5) %}
          {% set dp = states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0) %}
          {% set dd = states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0) %}
          {% set np = states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0) %}
          {% set nd = states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0) %}
          {% if is_weekend %}
            {{ (np + nd)|round(4) }}
          {% elif (6 <= hour < 13) or (15 <= hour < 22) %}
            {{ (dp + dd)|round(4) }}
          {% else %}
            {{ (np + nd)|round(4) }}
          {% endif %}
        cena_brutto_1kWh: >
          {% set hour = now().hour %}
          {% set weekday = now().weekday() %}
          {% set is_weekend = (weekday >= 5) %}
          {% set dp = states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0) %}
          {% set dd = states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0) %}
          {% set np = states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0) %}
          {% set nd = states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0) %}
          {% set vat = 1 + states('sensor.stawka_vat_na_energie')|float(0) %}
          {% if is_weekend %}
            {{ ((np + nd) * vat)|round(4) }}
          {% elif (6 <= hour < 13) or (15 <= hour < 22) %}
            {{ ((dp + dd) * vat)|round(4) }}
          {% else %}
            {{ ((np + nd) * vat)|round(4) }}
          {% endif %}

oczywiście w State: > mozna sobie wtedy podarowac ustawianie cen…

1 Like

Założyłem, że to niestety prawda…

Ostatecznie, po optymalizacji kodu do postaci:

    # Taryfa G12w DZIEŃ/NOC/WEEKEND
    - name: Tauron Aktualna Taryfa G12w
      unique_id: tauron_aktualna_taryfa_g12w
      icon: mdi:meter-electric-outline
      state: >
        {% set hour = now().hour %}
        {% set is_weekend = (now().weekday() >=5 or states('calendar.swieta_w_polsce') == 'on') %}
          {% if not is_weekend %}          
            {% if (hour >= 6 and hour < 13) or (hour >=15 and hour < 22) %}
              {{"DZIENNA"}}
            {% else %}
              {{"NOCNA"}}
            {% endif %}
          {% else %}
            {{"WEEKEND"}}
          {% endif %}
      attributes:
        cena_netto_1kWh: >
          {% set cena = {
          "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
          "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
          "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
          "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0)}
          %}
          {% set hour = now().hour %}
          {% set is_weekend = (now().weekday() >=5 or states('calendar.swieta_w_polsce') == 'on') %}
            {% if not is_weekend %}          
              {% if (hour >= 6 and hour < 13) or (hour >=15 and hour < 22) %}
                {{ (cena.dp + cena.dd)|float(0)|round(4) }}
              {% else %}
                {{ (cena.np + cena.nd)|float(0)|round(4) }}
              {% endif %}
            {% else %}
              {{ (cena.np + cena.nd)|float(0)|round(4) }}
            {% endif %}
        cena_brutto_1kWh: >
          {% set cena = {
            "dp": states('sensor.tauron_dzienna_cena_energii_netto_g12w')|float(0),
            "dd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_dzien')|float(0),
            "np": states('sensor.tauron_nocna_cena_energii_netto_g12w')|float(0),
            "nd": states('sensor.tauron_oplata_dystrybucyjna_zmienna_netto_g12w_noc')|float(0),
            "vat": 1 + states('sensor.stawka_vat_na_energie')|float(0)}
          %}
          {% set hour = now().hour %}
          {% set is_weekend = (now().weekday() >=5 or states('calendar.swieta_w_polsce') == 'on') %}
            {% if not is_weekend %}          
              {% if (hour >= 6 and hour < 13) or (hour >=15 and hour < 22) %}
                {{ ((cena.dp + cena.dd) * cena.vat)|float(0)|round(4) }}
              {% else %}
                {{ ((cena.np + cena.nd) * cena.vat)|float(0)|round(4) }}
              {% endif %}
            {% else %}
              {{ ((cena.np + cena.nd) * cena.vat)|float(0)|round(4) }}
            {% endif %}

otrzymałem wreszcie upragnioną postać sensora z atrybutami:

Wszystkim Wam bardzo za te wskazówki DZIĘKUJĘ :slight_smile: