FVE odpojování invertoru od sítě

Fotovoltaická elektrárna (solární park, solární farma, solární elektrárna) a Home Assistant.
Photovoltaic power station (solar park, solar farm, solar power plant) & Home Assistant.
Uživatelský avatar
acerot
Pokročilý
Pokročilý
Příspěvky: 118
Registrován: 12. prosinec 2022, 15:44
Dal poděkování: 2 poděkování
Dostal poděkování: 24 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od acerot »

Jenom rychlé oko ;) Předpokládám, že napětí záporné na rozdíl od proudů není, takže zkus tohle:

Kód: Vybrat vše

{% set u1 = states('sensor.Wattmetr_Napětí_U1') | float(0) %}
Parametr 0 ve funkci float je defaultní hodnota, kterou funkce vrátí, když se jí nepovede hodnotu senzoru na float převést (např. proto, že hodnota senzoru je unavailable nebo unknown nebo je to řetězec apod.), takže si ji zvol jak potřebuješ, možná jinou než 0, třeba 230 nebo tak.
A poznámka: Zkoušíš si napřed ty šablony v Nástrojích pro vývojáře, než je zapíšeš do YAMLu do senzoru?
A nakonec: Syntaxi template senzoru máš napsanou tak říkajíc postaru (legacy template syntax). Doporučuju psát template senzory dle nové syntaxe, vše popsáno v helpu https://www.home-assistant.io/integrati ... ion-format

fitor
Aktivní autor
Aktivní autor
Příspěvky: 76
Registrován: 14. září 2022, 21:53
Dal poděkování: 1 poděkování
Dostal poděkování: 2 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od fitor »

Už jsem to rozchodil. Problém byl v diakritice. Poučení pro mě: nepoužívat háčky a možná ani čárky.

Do správného zapisování template pokouším proniknout, ale moc to zatím nechápu.
Tohle je táké legacy?

Kód: Vybrat vše

template:
  - sensor:
      - name: "power import"
        unit_of_measurement: "W"
        state: >
          {% if states('sensor.wattrouter_proud_L1') | float < 0 %}
            {% set i1 = states('sensor.wattrouter_proud_L1') | float | abs %}
          {% else -%}
            {% set i1 = 0 %}
          {% endif %}      
          {% if states('sensor.wattrouter_proud_L2') | float < 0 %}
            {% set i2 = states('sensor.wattrouter_proud_L2') | float | abs %}
          {% else -%}
            {% set i2 = 0 %}
          {% endif %} 
          {% if states('sensor.wattrouter_proud_L3') | float < 0 %}
            {% set i3 = states('sensor.wattrouter_proud_L3') | float | abs %}
          {% else -%}
            {% set i3 = 0 %}
          {% endif %} 
           {% set u1 = states('sensor.wattrouter_napeti_u1')|float %}
          {{ (i1 + i2 + i3) * u1 | float | round(0)}}
          
  - sensor:
      - name: "power export"
        unit_of_measurement: "W"
        state: >
          {% if states('sensor.wattrouter_proud_L1') | float > 0 %}
            {% set i1 = states('sensor.wattrouter_proud_L1')|float %}
          {% else -%}
            {% set i1 = 0 %}
          {% endif %}      
          {% if states('sensor.wattrouter_proud_L2') | float > 0 %}
            {% set i2 = states('sensor.wattrouter_proud_L2')|float %}
          {% else -%}
            {% set i2 = 0 %}
          {% endif %} 
          {% if states('sensor.wattrouter_proud_L3') | float > 0 %}
            {% set i3 = states('sensor.wattrouter_proud_L3')|float %}
          {% else -%}
            {% set i3 = 0 %}
          {% endif %} 
           {% set u1 = states('sensor.wattrouter_napeti_u1')|float %}
          {{ (i1 + i2 + i3) * u1 | float | round(0)}}

Uživatelský avatar
acerot
Pokročilý
Pokročilý
Příspěvky: 118
Registrován: 12. prosinec 2022, 15:44
Dal poděkování: 2 poděkování
Dostal poděkování: 24 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od acerot »

Ne, to je ten nový způsob zápisu template senzoru.

Ještě ti poradím, jak rozházet konfiguraci do víc složek/souborů, abys to neměl všechno narvaný v jednom dlouhatánským souboru configuration.yaml. Je to tady na fóru kdesi popsaný obecně, ale například konkrétně pro template senzory, které nejsou možná tak úplně očividné, to lze udělat třeba takhle:

Do configuration.yaml si napiš tohle (ten binary senzor je jen na ukázku dalšího typu template senzoru):

Kód: Vybrat vše

template:
  - sensor: !include_dir_merge_list template_sensor/
  - binary_sensor: !include_dir_merge_list template_binary_sensor/
A ve složce config si vytvoř složku template_sensor a do ní můžeš vkládat další složky nebo jen další soubory nebo obojí, podle toho, jak to chceš mít hierarchicky udělané. Názvy složek ani souborů nehrají roli.

V těch souborech pak zapisuj jednotlivé template senzory takhle (pomlčky na začátku nejsou odsazeny od levého okraje). Do jakýho souboru dáš jaké senzory je plně na tobě. Je to prostě jen pro lepší pořádek a přehled.

Kód: Vybrat vše

- name: "elektromery_3f_proud_l1"
  unit_of_measurement: A
  device_class: current
  state: >
    {% set faze_prizemi = states('sensor.elektromer_prizemi_3f_proud_l1') | float %}
    {% set faze_1_patro = states('sensor.elektromer_1_patro_3f_proud_l1') | float %}
    {{ (faze_prizemi + faze_1_patro) | round(2, 'common') }}

- name: "elektromery_3f_proud_l2"
  unit_of_measurement: A
  device_class: current
  state: >
    {% set faze_prizemi = states('sensor.elektromer_prizemi_3f_proud_l2') | float %}
    {% set faze_1_patro = states('sensor.elektromer_1_patro_3f_proud_l2') | float %}
    {{ (faze_prizemi + faze_1_patro) | round(2, 'common') }}

fitor
Aktivní autor
Aktivní autor
Příspěvky: 76
Registrován: 14. září 2022, 21:53
Dal poděkování: 1 poděkování
Dostal poděkování: 2 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od fitor »

Také jsem o tom přemýšlel, ale stále jsem si říkal, že ta velikost ještě není přespříliš.
Ale podle Tvojeho mávodu to určitě udělám. Celkem jednoduše jsi to vysvětlil.

fitor
Aktivní autor
Aktivní autor
Příspěvky: 76
Registrován: 14. září 2022, 21:53
Dal poděkování: 1 poděkování
Dostal poděkování: 2 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od fitor »

Tak jsem to zkusil, vytvořil soubor /config/template_sensor/spot kam jsem vložil template co mám ke spotovým cenám, ale stále to vidi jen ty template, co zůstaly v config.yaml
Můžou tam zůstat ostatní senzory

Kód: Vybrat vše

template:
  - sensor: !include_dir_merge_list template_sensor/

  - sensor:
      - name: "spot_maximalni_cena_dopoledne"
        unit_of_measurement: ""
        state: >
            {# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
            {% set intervals = [
              (0, 12),
            ] %}

            {# We need to use namespace so we can write into it in inner cycle #}
            {% set max = namespace(price=None, dt=None, most_expensive_hours=[]) %}
            {% set most_expensive_hours = [] %}


            {% for interval in intervals %}
              {# Reset max price from previous runs #}
              {% set max.price = None %}

              {# Go through all the hours in the interval (end excluded) and find the hour with highest price #}
              {% for i in range(interval[0], interval[1]) %}
                 {# Get datetime of current hour in current interval #}
                 {% set hour_dt = now().replace(hour=i, minute=0, second=0, microsecond=0) %}

                 {# Get value for that hour #}
                 {% set value = states.sensor.current_spot_electricity_hour_order.attributes.get(hour_dt.isoformat()) %}

                 {# value is tuple (order, price), we'll use the price #}
                 {% set price = value[1] %}

                 {# Max price is not set or is higher than price of current hour => store the max price and hour #}
                 {% if max.price is none or price > max.price %}
                    {% set max.price = price %}
                    {% set max.dt = hour_dt %}
                 {% endif %}
              {% endfor %}

              {# Store most expensive hour in current interval #}
              {% set max.most_expensive_hours = max.most_expensive_hours + [max.dt.hour] %}
            {% endfor %}

            {{ max.price }}

  - sensor:
      - name: "power import"
        unit_of_measurement: "W"
        device_class: power
        state: >
          {% if states('sensor.wattrouter_proud_L1') | float < 0 %}
            {% set i1 = states('sensor.wattrouter_proud_L1') | float | abs %}
          {% else -%}
            {% set i1 = 0 %}
          {% endif %}      
          {% if states('sensor.wattrouter_proud_L2') | float < 0 %}
            {% set i2 = states('sensor.wattrouter_proud_L2') | float | abs %}
          {% else -%}
            {% set i2 = 0 %}
          {% endif %} 
          {% if states('sensor.wattrouter_proud_L3') | float < 0 %}
            {% set i3 = states('sensor.wattrouter_proud_L3') | float | abs %}
          {% else -%}
            {% set i3 = 0 %}
          {% endif %} 
           {% set u1 = states('sensor.wattrouter_napeti_u1')|float %}
          {{ (i1 + i2 + i3) * u1 | float | round(0)}}
          
nebo musím všechny senzory přepsat do /config/template_sensor/xxxx

V /config/template_sensor/spot mám toto, ale senzor se mi v HA nezobrazí

Kód: Vybrat vše

- sensor:
    - name: "spot_hodina_s_maximalni_cenou_dopoledne"
      unit_of_measurement: ""
      state: >
          {# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
          {% set intervals = [
            (0, 12),
          ] %}

          {# We need to use namespace so we can write into it in inner cycle #}
          {% set max = namespace(price=None, dt=None, most_expensive_hours=[]) %}
          {% set most_expensive_hours = [] %}


          {% for interval in intervals %}
            {# Reset max price from previous runs #}
            {% set max.price = None %}

            {# Go through all the hours in the interval (end excluded) and find the hour with highest price #}
            {% for i in range(interval[0], interval[1]) %}
               {# Get datetime of current hour in current interval #}
               {% set hour_dt = now().replace(hour=i, minute=0, second=0, microsecond=0) %}

               {# Get value for that hour #}
               {% set value = states.sensor.current_spot_electricity_hour_order.attributes.get(hour_dt.isoformat()) %}

               {# value is tuple (order, price), we'll use the price #}
               {% set price = value[1] %}

               {# Max price is not set or is higher than price of current hour => store the max price and hour #}
               {% if max.price is none or price > max.price %}
                  {% set max.price = price %}
                  {% set max.dt = hour_dt %}
               {% endif %}
            {% endfor %}

            {# Store most expensive hour in current interval #}
            {% set max.most_expensive_hours = max.most_expensive_hours + [max.dt.hour] %}
          {% endfor %}

          {{ max.most_expensive_hours }}

Uživatelský avatar
acerot
Pokročilý
Pokročilý
Příspěvky: 118
Registrován: 12. prosinec 2022, 15:44
Dal poděkování: 2 poděkování
Dostal poděkování: 24 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od acerot »

Slovo sensor: pod direktivou template: může existovat jen jednou (stejně jako direktiva template: může být v celé konfiguraci (všechny soubory ve všech (pod)složkách) jen jednou (výjimka viz níže). Pokud kompilátor najde víc stejných direktiv, buď hodí chybu, anebo vezme v potaz jen tu poslední - to by odpovídalo tomu, že tobě akceptuje jen to druhé sensor: pod template: a ten include vůbec nezohlední. Jak jednou něco includneš, tak do té includnuté složky/souboru přesuň vše, co se toho týká (co pod to patří).

Takže to zkus z configuration.yaml všechno přesunout do té podsložky a dej vědět.

Ještě poznámka. Kdysi jsem někde našel, že pojmenování direktivy umožní mít direktivu i víc než jednou. Já to používám jen na tyhle 3 integrace, protože chci, aby kompilátor bral v potaz jak moje vlastní include podsložky, tak i originální soubory, do kterých strká věci HA, když je vytváříš naklikáním v GUI. To slovo moje je to pojmenování a vidíš, že mám direktivu každé integrace v souboru configuration.yaml dvakrát a přesto to funguje.

Kód: Vybrat vše

automation: !include automations.yaml
automation moje: !include_dir_merge_list automation_moje/
script: !include scripts.yaml
script moje: !include_dir_merge_named script_moje/
scene: !include scenes.yaml
scene moje: !include_dir_merge_list scene_moje/
Pro info: Pomocí include rozhazuješ konfiguraci do podsložky/souboru dle direktiv integrací, takže například k sobě jen samý input_booleany nebo jen samý binary_sensory/timery/automatizace atd. Pokud by se ti to takto nelíbilo, ještě existuje jiný způsob rozházení konfigurace do podsložek/souborů a sice packages. Tam zase dáváš do podsložky/souboru k sobě konfiguraci, která se týká stejné věci, ale může být z různých integrací, například do složky topení dáš k sobě senzory, input_numbery, generic_thermostaty atd. Viz https://www.home-assistant.io/docs/conf ... /packages/. Je to dobře popsané i tu na fóru.

UPDATE: Teď jsem si teprve všimnul, že tam máš to sensor: 3krát (ne 2krát) :D Které senzory ti tedy v HA existují - jen ty z toho třetího sensor: nebo i z toho druhého?

fitor
Aktivní autor
Aktivní autor
Příspěvky: 76
Registrován: 14. září 2022, 21:53
Dal poděkování: 1 poděkování
Dostal poděkování: 2 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od fitor »

Ahoj,
v konfig.yaml mám

Kód: Vybrat vše

template:
  - sensor: !include_dir_merge_list template_sensor/

  - sensor:
      - name: "spot_maximalni_cena_dopoledne"
        unit_of_measurement: ""
        state: >
            {# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
            {% set intervals = [
              (0, 12),
            ] %}

            {# We need to use namespace so we can write into it in inner cycle #}
            {% set max = namespace(price=None, dt=None, most_expensive_hours=[]) %}
            {% set most_expensive_hours = [] %}


            {% for interval in intervals %}
              {# Reset max price from previous runs #}
              {% set max.price = None %}

              {# Go through all the hours in the interval (end excluded) and find the hour with highest price #}
              {% for i in range(interval[0], interval[1]) %}
                 {# Get datetime of current hour in current interval #}
                 {% set hour_dt = now().replace(hour=i, minute=0, second=0, microsecond=0) %}

                 {# Get value for that hour #}
                 {% set value = states.sensor.current_spot_electricity_hour_order.attributes.get(hour_dt.isoformat()) %}

                 {# value is tuple (order, price), we'll use the price #}
                 {% set price = value[1] %}

                 {# Max price is not set or is higher than price of current hour => store the max price and hour #}
                 {% if max.price is none or price > max.price %}
                    {% set max.price = price %}
                    {% set max.dt = hour_dt %}
                 {% endif %}
              {% endfor %}

              {# Store most expensive hour in current interval #}
              {% set max.most_expensive_hours = max.most_expensive_hours + [max.dt.hour] %}
            {% endfor %}

            {{ max.price }}

  - sensor:
      - name: "power import"
        unit_of_measurement: "W"
        device_class: power
        state: >
          {% if states('sensor.wattrouter_proud_L1') | float < 0 %}
            {% set i1 = states('sensor.wattrouter_proud_L1') | float | abs %}
          {% else -%}
            {% set i1 = 0 %}
          {% endif %}      
          {% if states('sensor.wattrouter_proud_L2') | float < 0 %}
            {% set i2 = states('sensor.wattrouter_proud_L2') | float | abs %}
          {% else -%}
            {% set i2 = 0 %}
          {% endif %} 
          {% if states('sensor.wattrouter_proud_L3') | float < 0 %}
            {% set i3 = states('sensor.wattrouter_proud_L3') | float | abs %}
          {% else -%}
            {% set i3 = 0 %}
          {% endif %} 
           {% set u1 = states('sensor.wattrouter_napeti_u1')|float %}
          {{ (i1 + i2 + i3) * u1 | float | round(0)}}
          
  - sensor:
      - name: "power export"
        unit_of_measurement: "W"
        device_class: power
        state: >
          {% if states('sensor.wattrouter_proud_L1') | float > 0 %}
            {% set i1 = states('sensor.wattrouter_proud_L1')|float %}
          {% else -%}
            {% set i1 = 0 %}
          {% endif %}      
          {% if states('sensor.wattrouter_proud_L2') | float > 0 %}
            {% set i2 = states('sensor.wattrouter_proud_L2')|float %}
          {% else -%}
            {% set i2 = 0 %}
          {% endif %} 
          {% if states('sensor.wattrouter_proud_L3') | float > 0 %}
            {% set i3 = states('sensor.wattrouter_proud_L3')|float %}
          {% else -%}
            {% set i3 = 0 %}
          {% endif %} 
           {% set u1 = states('sensor.wattrouter_napeti_u1')|float %}
          {{ (i1 + i2 + i3) * u1 | float | round(0)}}

  - sensor:
    - name: 'Daily Energy Import Total '
      device_class: energy
      unit_of_measurement: kWh
      state: >
        {% if is_number(states('sensor.daily_energy_import_offpeak')) and is_number(states('sensor.daily_energy_import_peak')) %}
          {{ states('sensor.daily_energy_import_offpeak') | float + states('sensor.daily_energy_import_peak') | float }}
        {% else %}
          None
        {% endif %}

    - name: 'Monthly Energy Import Total'
      device_class: energy
      unit_of_measurement: kWh
      state: >
        {% if is_number(states('sensor.monthly_energy_import_offpeak')) and is_number(states('sensor.monthly_energy_import_peak')) %}
          {{ states('sensor.monthly_energy_import_offpeak') | float + states('sensor.monthly_energy_import_peak') | float }}
        {% else %}
          None
        {% endif %}

    - name: 'Yearly Energy Import Total'
      device_class: energy
      unit_of_measurement: kWh
      state: >
        {% if is_number(states('sensor.yearly_energy_importx_offpeak')) and is_number(states('sensor.yearly_energy_importx_peak')) %}
          {{ states('sensor.yearly_energy_importx_offpeak') | float + states('sensor.yearly_energy_importx_peak') | float }}
        {% else %}
          None
        {% endif %}
        
    - name: 'Yearly Energy Saldo CEZ 04_2023'
      device_class: energy
      unit_of_measurement: kWh
      state: >
        {% if is_number(states('sensor.energy_export_04_2023')) and is_number(states('sensor.energy_import_04_2023')) %}
          {{ states('sensor.energy_export_04_2023') | float - states('sensor.energy_import_04_2023') | float + 75 }}
        {% else %}
          None
        {% endif %}
a ty senzory chodí.
Tohle mám v /config/template_sensor/spot

Kód: Vybrat vše

- name: "spot_hodina_s_maximalni_cenou_dopoledne"
  unit_of_measurement: ""
  state: >
      {# Define your intervals here as tuples (hour starting the interval, hour ending the interval (excluded)) #}
      {% set intervals = [
        (0, 12),
      ] %}

      {# We need to use namespace so we can write into it in inner cycle #}
      {% set max = namespace(price=None, dt=None, most_expensive_hours=[]) %}
      {% set most_expensive_hours = [] %}


      {% for interval in intervals %}
        {# Reset max price from previous runs #}
        {% set max.price = None %}

        {# Go through all the hours in the interval (end excluded) and find the hour with highest price #}
        {% for i in range(interval[0], interval[1]) %}
           {# Get datetime of current hour in current interval #}
           {% set hour_dt = now().replace(hour=i, minute=0, second=0, microsecond=0) %}

           {# Get value for that hour #}
           {% set value = states.sensor.current_spot_electricity_hour_order.attributes.get(hour_dt.isoformat()) %}

           {# value is tuple (order, price), we'll use the price #}
           {% set price = value[1] %}

           {# Max price is not set or is higher than price of current hour => store the max price and hour #}
           {% if max.price is none or price > max.price %}
              {% set max.price = price %}
              {% set max.dt = hour_dt %}
           {% endif %}
        {% endfor %}

        {# Store most expensive hour in current interval #}
        {% set max.most_expensive_hours = max.most_expensive_hours + [max.dt.hour] %}
      {% endfor %}

      {{ max.most_expensive_hours }}
ale senzor nechodí. Přitom když ho vložím do šablony tak ano.

Uživatelský avatar
acerot
Pokročilý
Pokročilý
Příspěvky: 118
Registrován: 12. prosinec 2022, 15:44
Dal poděkování: 2 poděkování
Dostal poděkování: 24 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od acerot »

Divný, nemělo by ti to chodit ;) Sensor: by pod template: neměl být víckrát, takže by měly existovat jen senzory
  • Daily Energy Import Total
  • Monthly Energy Import Total
  • Yearly Energy Import Total
  • Yearly Energy Saldo CEZ 04_2023
z posledního sensor: a naopak by neměly existovat ty ostatní před tím.

Zapoznámkuj všechno pod template: kromě toho řádku s includem - anebo ho dej na konec sekce template: - a načti znovu konfig, jestli se ti senzor spot_hodina_s_maximalni_cenou_dopoledne objeví. A samozřejmě se dívej po načtení konfigurace do logu, kde ti HA může případně napsat, co se mu v konfigu nelíbilo.

fitor
Aktivní autor
Aktivní autor
Příspěvky: 76
Registrován: 14. září 2022, 21:53
Dal poděkování: 1 poděkování
Dostal poděkování: 2 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od fitor »

Když mám v config.yaml
template:
- sensor: !include_dir_merge_list template_sensor/
a za tím všechny senzory, tak to funguje.
Když část senzorů (pro spot) přesunu do /config/template_sensor/spot
tak přestanou fungovat. Ty co zůstaly v config.yaml fungují dál.
Jak se mají vložit senzory, stačí jen umazat mezery před pomlčou před senzor nebo se musí - sensor: umazat a nechat jen - name: ?
Dík

mamonick
Dárce - Donátor
Dárce - Donátor
Příspěvky: 187
Registrován: 20. září 2021, 13:47
Bydliště: Třebechovice p. O.
Dal poděkování: 23 poděkování
Dostal poděkování: 22 poděkování

Re: FVE odpojování invertoru od sítě

Příspěvek od mamonick »

To máš nějaký divný.
Správně bys měl mít v configuration.yaml, pokud chceš mít template v samostatných souborech include takto (v tvém případě):

Kód: Vybrat vše

template: !include_dir_merge_list template_sensor
A v adresáři

Kód: Vybrat vše

template_sensor
máš soubory s jednotlivými template sensory.

A v nich zápis už (bez uvedení template) např. takto:

Kód: Vybrat vše

# Změna kladné hodnoty na minus a přidání jednotky 
  - sensor:
      - name: goodwee_rssi
        unit_of_measurement: "dBm"
        state: "{{ (states('sensor.rssi')|float * -1) | round(0) }}"
A pak tedy v tomto případě není možné mít jakýkoliv template sensor jinde, něž v nějakém souboru v adresáři template_sensor

Odpovědět

Zpět na „FVE a Home Assistant“