Bazén

Automatizace tvořené přímo, pomocí funkcí HomeAssitent(a).
Odpovědět
SirusSK
Nováček na fóru
Nováček na fóru
Příspěvky: 4
Registrován: 23. únor 2023, 20:35
Dal poděkování: 2 poděkování

Bazén

Příspěvek od SirusSK »

Dobry vecer,
mam uz HA doma nainstalovane nejaky cas na RPI4, vsetko funguje, spravil som nejake jednoduche automatizacie a po mensich komplikaciach funguju. Teraz som sa rozhodol automatizovat solarny ohrev a filtraciu bazena. Potreboval by som nasmerovat ako spravit spravne tuto automatizaciu.
Dostupne senzory a rele:
- teplota bazena TB
- teplota panela TP
- senzor nizkej tarify SNT
- rele cerpadla panela RCP
- rele cerpadla filtracie RCF
Pomocne hodnoty, ktore som vytvoril
- hystereza zopnutia HZ
- hystereza vypnutia HV
- maximalna teplota bazena MTB
- cerpadla iba pri nizkej tarife CNT
- rozdiel teplot panela a bazena RTPB=TP-TB

Nejak som to polepil a funguje to, teda ciastocne.
Prva automatizacia je : ak je RTPB>HZ a TB<MTP potom spusti RCP
Druha automatizacia je: ak je RTPB<HV potom vypni RCP
A teraz zacina ta sranda, chcel by som aby sa spustalo RCP:
a.) SNT je pravda alebo
b.) SNT je nepravda a zaroven CNT je nepravda
Chcel by som aby sa cerpadlo RCP vyplo:
a.) SNT je nepravda a CNT je nepravda.
Vyriesil som to tak ze vypinam a zapinam prvu automatizaciu.

Nefunguje mi to uplne podla mojich predstav.
Tu je moj kod. Prosim niekoho kto v tom ma skusenosti aby mi pomohol optimalizovat kod. Dakujem.

Kód: Vybrat vše

- id: '1675286150498'
  alias: Solárne panely bazéna - zapnutie
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.panel_pool_temp_diff
    above: input_number.pool_on_hyst
    for:
      hours: 0
      minutes: 5
      seconds: 0
  condition:
  - condition: numeric_state
    entity_id: sensor.panel_pool_temp_diff
    below: input_number.pool_max_temp
  action:
  - type: turn_on
    device_id: 517f317115580fb826418fed9a29fcdd
    entity_id: switch.sonoff_10011ffc9e
    domain: switch
  mode: single
- id: '1675978743813'
  alias: Solárne panely bazéna - vypnutie
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.panel_pool_temp_diff
    for:
      hours: 0
      minutes: 1
      seconds: 0
    below: input_number.pool_off_hyst
  - platform: numeric_state
    entity_id: sensor.sonoff_1001200d4a_temperature
    above: input_number.pool_max_temp
  condition: []
  action:
  - type: turn_off
    device_id: 517f317115580fb826418fed9a29fcdd
    entity_id: switch.sonoff_10011ffc9e
    domain: switch
  mode: single
- id: '1675979521725'
  alias: Nie je nizka tarifa
  description: ''
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.senzor_nizkej_tarify
    from: 'on'
    to: 'off'
  condition: []
  action:
  - if:
    - condition: state
      entity_id: input_boolean.nizka_tarifa
      state: 'on'
    then:
    - service: automation.turn_off
      data:
        stop_actions: true
      target:
        entity_id: automation.spustenie
  mode: single
- id: '1676191656335'
  alias: Je nizka tarifa
  description: ''
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.senzor_nizkej_tarify
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: automation.turn_on
    data: {}
    target:
      entity_id: automation.spustenie
  mode: single

Uživatelský avatar
Lion®
Administrátor fóra
Administrátor fóra
Příspěvky: 1604
Registrován: 28. září 2020, 14:07
Bydliště: podkrkonoší
Dal poděkování: 144 poděkování
Dostal poděkování: 193 poděkování
Kontaktovat uživatele:

Re: Bazén

Příspěvek od Lion® »

SirusSK píše: 23. únor 2023, 21:14
A teraz zacina ta sranda, chcel by som aby sa spustalo RCP:
a.) SNT je pravda alebo
b.) SNT je nepravda a zaroven CNT je nepravda
Spouštěč 1: Stav SNT (bez stavů)
Spouštěč 2: Stav CNT (bez stavů)

Podmínky:

Kód: Vybrat vše

Funkce: Nebo
  SNT je pravda
  Funkce: A
    SNT je nepravda
    CNT je nepravda
SirusSK píše: 23. únor 2023, 21:14 Chcel by som aby sa cerpadlo RCP vyplo:
a.) SNT je nepravda a CNT je nepravda.
Spouštěč 1: Stav SNT (bez stavů)
Spouštěč 2: Stav CNT (bez stavů)

Podmínky:

Kód: Vybrat vše

Funkce: A
SNT je nepravda
CNT je nepravda
________________
🍻 Přispěj a získej přístup do obsahu fóra pro dárce. :thx:
Oficiální sada s Raspberry Pi 4B/4GB, černá +Argon NEO Raspberry Pi 4 Case
Patriot Burst 2.5" SATA SSD 120GB + AXAGON EE25-XA6 ALINE box

Galerie realizací

SirusSK
Nováček na fóru
Nováček na fóru
Příspěvky: 4
Registrován: 23. únor 2023, 20:35
Dal poděkování: 2 poděkování

Re: Bazén

Příspěvek od SirusSK »

Tak som nieco zlepil a snad to bude fungovat. Vsetko som robil cez UI, tak snad to je OK. Musim priznat ze viem co to naprogramovat v php, visual basicu dokonca aj arduino, ale tento yaml jazyk je pre mna peklo.

Kód: Vybrat vše

- id: '1675286150498'
  alias: Solárne panely bazéna - zapnutie
  description: Zapne čerpadlo solárneho panela ak je teplota panela vyššia ako teplota
    bazéna o hysterézu zapnutia
  trigger:
  - platform: numeric_state
    entity_id: sensor.panel_pool_temp_diff
    above: input_number.pool_on_hyst
    for:
      hours: 0
      minutes: 5
      seconds: 0
  condition:
  - condition: numeric_state
    entity_id: sensor.sonoff_1001200d4a_temperature
    below: input_number.pool_max_temp
  action:
  - type: turn_on
    device_id: 517f317115580fb826418fed9a29fcdd
    entity_id: switch.sonoff_10011ffc9e
    domain: switch
  mode: single
- id: '1675978743813'
  alias: Solárne panely bazéna - vypnutie
  description: Vypne čerpadlo solárneho panela ak je rozdiel teplôt panela a bazéna
    menší ako hysteréza vypnutia, prípadne bola dosiahnutá maximálna teplota bazéna
  trigger:
  - platform: numeric_state
    entity_id: sensor.panel_pool_temp_diff
    for:
      hours: 0
      minutes: 1
      seconds: 0
    below: input_number.pool_off_hyst
  - platform: numeric_state
    entity_id: sensor.sonoff_1001200d4a_temperature
    above: input_number.pool_max_temp
  condition: []
  action:
  - type: turn_off
    device_id: 517f317115580fb826418fed9a29fcdd
    entity_id: switch.sonoff_10011ffc9e
    domain: switch
  mode: single
- id: '1675979521725'
  alias: Nie je nizka tarifa
  description: Ak je vysoká tarifa povolí automatizáciu len vtedy ak som to povolil
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.senzor_nizkej_tarify
    from: 'on'
    to: 'off'
  condition: []
  action:
  - if:
    - condition: state
      entity_id: input_boolean.nizka_tarifa
      state: 'on'
    then:
    - service: automation.turn_off
      data:
        stop_actions: true
      target:
        entity_id: automation.spustenie
  mode: restart
- id: '1676191656335'
  alias: Je nizka tarifa
  description: Ak je nízka tarifa povolí automatizáciu bazéna
  trigger:
  - platform: state
    entity_id:
    - binary_sensor.senzor_nizkej_tarify
    from: 'off'
    to: 'on'
  condition: []
  action:
  - service: automation.turn_on
    data: {}
    target:
      entity_id: automation.spustenie
  mode: restart
Nepozrel by ste sa na to, ci je tam este nieco na zlepsenie?

Neviem ci mozem s mojimi otazkami ohladne inych automatizacii pokracovat tu alebo mam zalozit nove vlakno ale skusim tu.
Spravil som primitivnu automatizaciu na to aby sa na WC vyplo svetlo po 15 minutach. S pevne nastavenym casom to funguje super, ale povedal som si ze ked existuje helper input_datetime preco by som ho tam nemohol pouzit. Takze som vytvoril premennu input_datetime.wc_time_off a doplnik do automatizacie for: input_datetime.wc_time_off, ale ono to nefunguje. Preco?

Kód: Vybrat vše

alias: Vypni WC za 15 minut
description: ""
trigger:
  - platform: state
    entity_id: switch.sonoff_10012cb723_1
    to: "on"
    for:
      hours: 0
      minutes: 15
      seconds: 0
condition: []
action:
  - service: switch.turn_off
    data: {}
    entity_id: switch.sonoff_10012cb723_1
mode: single

Uživatelský avatar
Lion®
Administrátor fóra
Administrátor fóra
Příspěvky: 1604
Registrován: 28. září 2020, 14:07
Bydliště: podkrkonoší
Dal poděkování: 144 poděkování
Dostal poděkování: 193 poděkování
Kontaktovat uživatele:

Re: Bazén

Příspěvek od Lion® »

Zhasínání na WC řešíš dobře. Dá se i třeba takto.

Kód: Vybrat vše

alias: Vypni WC za 15 minut
description: ""
trigger:
  - platform: state
    entity_id:
      - switch.sonoff_10012cb723_1
    to: "on"
    for:
      hours: 0
      minutes: 0
      seconds: 0
condition: []
action:
  - delay:
      hours: 0
      minutes: 15
      seconds: 0
      milliseconds: 0
  - service: switch.turn_off
    data: {}
    entity_id: switch.sonoff_10012cb723_1
mode: single

Ale pokud chceš hýbat s těmi 15 minutami tak bych spíš použil pomocníka s názvem Timer.
Automatizace trošku složitější. Budeš muset při zapnutí světla ten timer spustit službou. A další službou vypnout světlo až ten timer doběhne.

Já ale zhasínáním světel Home Assistanta vůbec nezatěžuji. Mám timery nastavený přímo v zařízení ať je to sonoff s Tasmotou nebo shelly. Světla mi tedy zhasnou i když se podělá wi-fi nebo malina.
________________
🍻 Přispěj a získej přístup do obsahu fóra pro dárce. :thx:
Oficiální sada s Raspberry Pi 4B/4GB, černá +Argon NEO Raspberry Pi 4 Case
Patriot Burst 2.5" SATA SSD 120GB + AXAGON EE25-XA6 ALINE box

Galerie realizací

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: Bazén

Příspěvek od acerot »

Mám pro tebe návrh. Píšeš, že umíš v programovacích jazycích, takže nejspíš umíš dobře i booleanovu logiku. Ten tvůj bazén není tak úplně triviální věc, co se týče kombinací různých faktorů (senzorů). Začínáš psát několik jednoduchých automatizací na jednu věc - ovládání bazénu. Je možný, že to tímto způsobem nakonec doladíš, ale taky se v tom můžeš začít ztrácet - jedna automatizace ti zapne, co ti jiná vypne, protože neuhlídáš všechny návaznosti apod. Všiml jsem si, že dokonce za určitých podmínek automatizaci vypínáš - to se mi nezdá moc systémový řešení.

Takže návrh: Vem si jeden aktor, který chceš ovládat, třeba ten RCP (nikdy jsem neměl bazén a netuším, co to má všechno dělat, tak mě ber s rezervou) a napiš pro něj dlouhatánskou logickou podmínku plnou ANDů, ORů, NOTů a závorek, která bude zahrnovat všechny faktory (entity), které mají na jeho stav vliv a pokaždé vypočtením této podmínky ti vždy jednoznačně vypadne, jestli má RCP teď právě čerpat nebo ne, vzhledem k aktuálním stavům všech entit v podmínce. Pokud se ti to povede, máš téměř hotovo. Tuto podmínku dáš do automatizace buď jako trigr typu template nebo ji dáš do sekce action (důvody/výhody proč tam nebo tam třeba později, jestli se rozhodneš to tak udělat) a to je v podstatě vše. Pro každý aktor uděláš takovouto podmínku. Tenhle způsob je jen návrh, samozřejmě to tak dělat nemusíš, ale mně se to v případě automatizací věcí, na něž má vliv spousta faktorů celkem osvědčilo (bylo to pro mě přehlednější, než psát několik automatizací nebo i jednu dlouhatánskou plnou IFů, CHOOSEů a kdoví čeho). Promysli to.

SirusSK
Nováček na fóru
Nováček na fóru
Příspěvky: 4
Registrován: 23. únor 2023, 20:35
Dal poděkování: 2 poděkování

Re: Bazén

Příspěvek od SirusSK »

Tak som si dal dokopy sialenu tabulku stavov pre jednotlive premenne ktore vstupuju do ovladania a pomocou online som to previedol na logicky vyraz:

Kód: Vybrat vše

y = a*!c*d*!e + a*b*d*!e
kde
a je porovnanie: teplota bazena [sensor.sonoff_1001200d4a_temperature] < maximalna nastavena teplota [input_number.pool_max_temp]
b je informacia o nizkej tarife (ak je nizka tarifa tak je true) [binary_sensor.senzor_nizkej_tarify]
c je informacia ci mam zapinat cerpadla iba pri nizkej tarife [input_boolean.nizka_tarifa]
d je true ak je rozdiel teploty panela a bazena [sensor.panel_pool_temp_diff] > hystereza zapnutia [input_number.pool_on_hyst]
e je true aj je rozdiel teploty panela a bezena [sensor.panel_pool_temp_diff] < hystereza vypnutia [input_number.pool_off_hyst]

A teraz sa priznavam, ze netusim ako by som to zapisal do yaml. V inom jazyku brnkacka typu:

Kód: Vybrat vše

A = (sensor.sonoff_1001200d4a_temperature<input_number.pool_max_temp)
B = binary_sensor.senzor_nizkej_tarify
C = input_boolean.nizka_tarifa
D = sensor.panel_pool_temp_diff>input_number.pool_on_hyst
E = sensor.panel_pool_temp_diff<input_number.pool_off_hyst

IF ((A AND NOT(C) AND D AND NOT(E)) OR (A AND B AND D AND NOT(E))) THEN
	spusti cerpadlo
ELSE
	vypni cerpadlo
END IF
Predpokladam ze to uz asi bude na rade vlozeny kod do yaml v nejakom inom jazyku.... Dakujem za trpezlivost a nasmerovanie.

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: Bazén

Příspěvek od acerot »

Doporučuju si ten výraz napřed odzkoušet ve Vývojářských nástrojích v Šablonách. Můžeš si napřed ze stavů entit udělat ty proměnné a, b, c ... a pak ten logický výraz napsat jen pomoci těch písmen (trochu delší text, přehlednější) nebo můžeš místo písmen rovnou použít funkce, které čtou stavy entit (trochu kratší text, nepřehledný).

To první vypadá zhruba takto (je to jen kousek vystřiženej z toho tvýho, nechce se mi to celý tvořit ;-) , ale určitě chytneš představu):

Kód: Vybrat vše

{% set a = (states("sensor.sonoff_1001200d4a_temperature") | float(0)) < (states("input_number.pool_max_temp") | float(0))  %}
{% set b = is_state("binary_sensor.senzor_nizkej_tarify", "on") %}
{% set y = (....... a * b .......) %}
{{ y }}
To druhý takto:

Kód: Vybrat vše

{{ ....... (states("sensor.sonoff_1001200d4a_temperature") | float(0)) < (states("input_number.pool_max_temp") | float(0)) and (is_states("binary_sensor.senzor_nizkej_tarify", "on")) ....... }}
Jen krátce (nastuduj templating a scripting v HA z helpu na jejich webu): Znaky {% a %} jsou pro psaní kódu typu příkazy (set, for, if, atd.), znaky {{ a }} jsou pro výpis výsledku na výstup, který je vrácen jako výsledná hodnoty té šablony.

Až to odladíš ke spokojenosti v Šablonách, tak to práskneš do automatizace jako trigger typu template. Ten spustí automatizaci pouze pokud ho HA vyhodnotí jako true. To by ti nestačilo, protože tobě ta šablona vrací true a false podle toho, zda má čerpadlo jet nebo stát. Jako u všeho je víc možných řešení. Ale třeba toto: Udělej 2 šablony: jedna bude true, když má čerpadlo jet a druhá bude true, když má stát. Do automatizace dáš trigry dva a pojmenuješ si je, abys v automatizaci věděl, který z nich ji vyvolal. V sekci action pak pomocí if zajistíš správnou činnost. Takže třeba takhle:

Kód: Vybrat vše

- alias: moje automatizace
  id: "moje_automatizace"
  mode: single
  trigger:
    # pro spuštění čerpadla
    - platform: template
      value_template: >
        {% .... %}
        sem přijde celá ta šablona, může být na více řádků, celý to nemusí být v uvozovkách, což zajišťuje ten znak > za value_template:, můžeš používat uvozovky (ne jen apostrofy)
        {% .... %}
        {% .... %}
        {% .... %}
        {% .... %}
        {{ .... }}
      id: "spustit"
    # pro zastavení čerpadla
    - platform: template
      value_template: >
        {% .... %}
        {% .... %}
        {% .... %}
        {% .... %}
        {% .... %}
        {{ .... }}
      id: "zastavit"
  action:
    - if:
        - condition: trigger
          id: "spustit"
      then:
        # tady spustíš čerpadlo
    - if:
        - condition: trigger
          id: "zastavit"
      then:
        # tady zastavíš čerpadlo
Samozřejmě s tím můžeš ještě dělat všelijaký psí kusy, tohle je jenom kostra a jenom jedno z mnoha řešení - jako se vším v programování ;-) Já to dělám ještě trochu jinak, ale to je na dýl, takže to pak jen v případě, že by ti tohle v něčem nevyhovovalo.

SirusSK
Nováček na fóru
Nováček na fóru
Příspěvky: 4
Registrován: 23. únor 2023, 20:35
Dal poděkování: 2 poděkování

Re: Bazén

Příspěvek od SirusSK »

O dakujem pane. Snad som to polepil spravne, chybu to nehadze, len to este musim odsledovat ci to funguje ok.

Kód: Vybrat vše

alias: Ovladanie cerpadla panelu
mode: single
trigger:
  - platform: template
    value_template: >
      {% set a = (states("sensor.sonoff_1001200d4a_temperature") | float(0)) <
      (states("input_number.pool_max_temp") | float(0))  %} {% set b =
      is_state("binary_sensor.senzor_nizkej_tarify", "on") %} {% set c =
      is_state("input_boolean.nizka_tarifa", "on") %} {% set d =
      (states("sensor.panel_pool_temp_diff") | float(0)) >
      (states("input_number.pool_on_hyst") | float(0))  %} {% set e =
      (states("sensor.panel_pool_temp_diff") | float(0)) <
      (states("input_number.pool_off_hyst") | float(0))  %} {% set y = ((a and
      not c and d and not e) or (a and b and d and not e)) %} {{ y }}
    id: spustit
  - platform: template
    value_template: >
      {% set a = (states("sensor.sonoff_1001200d4a_temperature") | float(0)) <
      (states("input_number.pool_max_temp") | float(0))  %} {% set b =
      is_state("binary_sensor.senzor_nizkej_tarify", "on") %} {% set c =
      is_state("input_boolean.nizka_tarifa", "on") %} {% set d =
      (states("sensor.panel_pool_temp_diff") | float(0)) >
      (states("input_number.pool_on_hyst") | float(0))  %} {% set e =
      (states("sensor.panel_pool_temp_diff") | float(0)) <
      (states("input_number.pool_off_hyst") | float(0))  %} {% set y = not ((a
      and not c and d and not e) or (a and b and d and not e)) %} {{ y }}
    id: zastavit
action:
  - if:
      - condition: trigger
        id: spustit
    then:
      - type: turn_on
        device_id: 517f317115580fb826418fed9a29fcdd
        entity_id: switch.sonoff_10011ffc9e
        domain: switch
  - if:
      - condition: trigger
        id: zastavit
    then:
      - type: turn_off
        device_id: 517f317115580fb826418fed9a29fcdd
        entity_id: switch.sonoff_10011ffc9e
        domain: switch

Odpovědět

Zpět na „Automatizace“